C# 继承、多态性、抽象和接口详解:从入门到精通

C# 继承

C# 中,可以将字段和方法从一个类继承到另一个类。我们将“继承概念”分为两类:

  • 派生类(子类) - 从另一个类继承的类
  • 基类(父类) - 被继承的类

要从一个类继承,使用 : 符号。

在以下示例中,Car 类(子类)继承了 Vehicle 类(父类)的字段和方法:

示例

1class Vehicle // 基类(父类) 2{ 3 public string brand = "Ford"; // 车辆字段 4 public void honk() // 车辆方法 5 { 6 Console.WriteLine("Tuut, tuut!"); 7 } 8} 9 10class Car : Vehicle // 派生类(子类) 11{ 12 public string modelName = "Mustang"; // 汽车字段 13} 14 15class Program 16{ 17 static void Main(string[] args) 18 { 19 // 创建一个 myCar 对象 20 Car myCar = new Car(); 21 22 // 在 myCar 对象上调用 honk() 方法(来自 Vehicle 类) 23 myCar.honk(); 24 25 // 显示 brand 字段(来自 Vehicle 类)的值和 modelName 字段(来自 Car 类)的值 26 Console.WriteLine(myCar.brand + " " + myCar.modelName); 27 } 28}

输出

1Tuut, tuut! 2Ford Mustang

为什么以及何时使用“继承”?

  • 它对于代码重用非常有用:在创建新类时重用现有类的字段和方法

sealed 关键字

如果您不希望其他类从一个类继承,请使用 sealed 关键字:

1sealed class Vehicle 2{ 3 ... 4} 5 6class Car : Vehicle 7{ 8 ... 9}

如果您尝试访问一个 sealed 类,C# 会生成一个错误:

'Car': cannot derive from sealed type 'Vehicle'

多态性和方法覆盖

多态性意味着 "多种形态",它发生在我们有许多通过继承相互关联的类时。继承允许我们从另一个类继承字段和方法。多态性使用这些方法来执行不同的任务。这允许我们以不同的方式执行单个动作。

例如,考虑一个名为 Animal 的基类,它有一个名为 animalSound() 的方法。Animal 的派生类可以是 PigsCatsDogsBirds,它们也有自己的 animalSound() 方法实现(猪会叫,猫会喵喵叫等)。

示例:

1class Animal // 基类(父类) 2{ 3 public virtual void animalSound() 4 { 5 Console.WriteLine("动物发出声音"); 6 } 7} 8 9class Pig : Animal // 派生类(子类) 10{ 11 public override void animalSound() 12 { 13 Console.WriteLine("猪说:wee wee"); 14 } 15} 16 17class Dog : Animal // 派生类(子类) 18{ 19 public override void animalSound() 20 { 21 Console.WriteLine("狗说:bow wow"); 22 } 23}

现在我们可以创建 PigDog 对象,并在它们两个上调用 animalSound() 方法:

示例:

1class Program 2{ 3 static void Main(string[] args) 4 { 5 Animal myAnimal = new Animal(); // 创建一个 Animal 对象 6 Animal myPig = new Pig(); // 创建一个 Pig 对象 7 Animal myDog = new Dog(); // 创建一个 Dog 对象 8 9 myAnimal.animalSound(); 10 myPig.animalSound(); 11 myDog.animalSound(); 12 } 13}

输出将为:

1动物发出声音 2猪说:wee wee 3狗说

C# 抽象

抽象类和方法

数据抽象是隐藏某些细节并仅向用户显示基本信息的过程。

抽象可以通过抽象类或接口来实现。

abstract 关键字用于类和方法:

  • 抽象类:是一个受限制的类,不能用于创建对象(要访问它,必须从另一个类继承)。
  • 抽象方法:只能在抽象类中使用,并且没有方法体。方法体由派生类(继承自)提供。

抽象类可以同时包含抽象方法和常规方法:

1abstract class Animal { 2 public abstract void animalSound(); 3 public void sleep() { 4 Console.WriteLine("Zzz"); 5 } 6}

从上面的例子可以看出,无法创建 Animal 类的对象:

1Animal myObj = new Animal(); // 将生成错误(无法创建抽象类或接口“Animal”的实例)

要访问抽象类,必须从另一个类继承它

例子

1// 抽象类 2abstract class Animal { 3 // 抽象方法(没有方法体) 4 public abstract void animalSound(); 5 // 常规方法 6 public void sleep() { 7 Console.WriteLine("Zzz"); 8 } 9} 10 11// 派生类(继承自 Animal) 12class Pig : Animal { 13 public override void animalSound() { 14 // animalSound() 的方法体在这里提供 15 Console.WriteLine("The pig says: wee wee"); 16 } 17} 18 19class Program { 20 static void Main(string[] args) { 21 Pig myPig = new Pig(); // 创建一个 Pig 对象 22 myPig.animalSound(); // 调用抽象方法 23 myPig.sleep(); // 调用常规方法 24 } 25}

为什么以及何时使用抽象类和方法?

  • 为了实现安全性——隐藏某些细节,只显示对象的重要细节。
  • 注意:抽象也可以通过接口实现

C# Interface

接口是在 C# 中实现抽象的另一种方式。

接口是一个完全“抽象类”,它只能包含抽象方法和属性(没有实际的方法体):

1// 接口 2interface Animal 3{ 4 void animalSound(); // 接口方法(没有方法体) 5 void run(); // 接口方法(没有方法体) 6}

通常,以字母 "I" 开头是一种良好的实践,因为这样可以更容易地记住它是一个接口而不是一个类。

默认情况下,接口的成员是抽象和公共的。

注意:接口可以包含属性和方法,但不能包含字段。

要访问接口方法,接口必须由另一个类“实现”(有点像继承)。要实现接口,请使用冒号符号(与继承一样)。接口方法的实际方法体由“实现”类提供。请注意,在实现接口时,不必使用 override 关键字:

1// 接口 2interface IAnimal 3{ 4 void animalSound(); // 接口方法(没有方法体) 5} 6 7// Pig “实现”了 IAnimal 接口 8class Pig : IAnimal 9{ 10 public void animalSound() 11 { 12 // animalSound() 的方法体在这里提供 13 Console.WriteLine("猪说:呜呜"); 14 } 15} 16 17class Program 18{ 19 static void Main(string[] args) 20 { 21 Pig myPig = new Pig(); // 创建一个 Pig 对象 22 myPig.animalSound(); 23 } 24}

接口的注意事项:

  • 与抽象类一样,接口不能用于创建对象(在上面的示例中,在 Program 类中不能创建“IAnimal”对象)。
  • 接口方法没有方法体 - 方法体由“实现”类提供。
  • 在实现接口时,必须覆盖其所有方法。
  • 接口可以包含属性和方法,但不能包含字段/变量。
  • 接口成员默认是抽象和公共的。
  • 接口不能包含构造函数(因为它不能用于创建对象)。

为什么以及何时使用接口?

  1. 为了实现安全性 - 隐藏对象的某些细节,仅显示重要的细节(接口)。
  2. C# 不支持“多继承”(一个类只能继承一个基类)。但是,可以通过接口实现多继承,因为类可以实现多个接口。注意:要实现多个接口,请使用逗号分隔它们(见下面的示例)。

为什么以及何时使用抽象类和方法?

  • 为了实现安全性——隐藏某些细节,只显示对象的重要细节。
  • 注意:抽象也可以通过接口实现

C# 接口

接口是在 C# 中实现抽象的另一种方式。

接口是一个完全“抽象类”,它只能包含抽象方法和属性(没有实际的方法体):

1// 接口 2interface Animal 3{ 4 void animalSound(); // 接口方法(没有方法体) 5 void run(); // 接口方法(没有方法体) 6}

通常,以字母 "I" 开头是一种良好的实践,因为这样可以更容易地记住它是一个接口而不是一个类。

默认情况下,接口的成员是抽象和公共的。

注意:接口可以包含属性和方法,但不能包含字段。

要访问接口方法,接口必须由另一个类“实现”(有点像继承)。要实现接口,请使用冒号符号(与继承一样)。接口方法的实际方法体由“实现”类提供。请注意,在实现接口时,不必使用 override 关键字:

1// 接口 2interface IAnimal 3{ 4 void animalSound(); // 接口方法(没有方法体) 5} 6 7// Pig “实现”了 IAnimal 接口 8class Pig : IAnimal 9{ 10 public void animalSound() 11 { 12 // animalSound() 的方法体在这里提供 13 Console.WriteLine("猪说:呜呜"); 14 } 15} 16 17class Program 18{ 19 static void Main(string[] args) 20 { 21 Pig myPig = new Pig(); // 创建一个 Pig 对象 22 myPig.animalSound(); 23 } 24}

接口的注意事项:

  • 与抽象类一样,接口不能用于创建对象(在上面的示例中,在 Program 类中不能创建IAnimal对象)。
  • 接口方法没有方法体 - 方法体由“实现”类提供。
  • 在实现接口时,必须覆盖其所有方法。
  • 接口可以包含属性和方法。

C# 多接口

要实现多个接口,请使用逗号分隔它们:

1interface IFirstInterface 2{ 3 void myMethod(); // 接口方法 4} 5 6interface ISecondInterface 7{ 8 void myOtherMethod(); // 接口方法 9} 10 11// 实现多个接口 12class DemoClass : IFirstInterface, ISecondInterface 13{ 14 public void myMethod() 15 { 16 Console.WriteLine("一些文本.."); 17 } 18 public void myOtherMethod() 19 { 20 Console.WriteLine("一些其他文本..."); 21 } 22} 23 24class Program 25{ 26 static void Main(string[] args) 27 { 28 DemoClass myObj = new DemoClass(); 29 myObj.myMethod(); 30 myObj.myOtherMethod(); 31 } 32}

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎 点赞、收藏、关注

点赞
收藏

评论区

加载中...

相关推荐

一篇文章带你搞懂Python中的继承和多态

一、继承的介绍继承是一种创建新的类的方式,新创建的叫子类,继承的叫父类、超类、基类。继承的特点就是子类可以使用父类的属性(特征、技能)。继承是类与类之间的关系。继承可以减少代码冗余、提高重用性。在现实生活中,继承一般指的是子女继承父辈的财产,如下图:二、如何用继承?1.继承语法Class派生类名(基类名):基类名写在括号里。在继承关系中,已有的,设计好

java中经常问到的面试题

1、面向对象编程的三大特性是什么?(1).继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例

你不可不知的JS面试题(第二期)

1、什么是继承?子类可以使用父类的所有功能,并且对功能进行扩展。新增方法改用方法(1)、ES6使用extends子类继承父类的方法。// 父类    class A        constructor(name)            this.name name;                getNa

python类的继承

一、概述   面向对象编程(OOP)语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。  通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”,继承的过程,就是从一般到特殊的过程。在某些OOP语言中,一个子类可以继

Python Day24:类的继承、派生、覆盖、super()、绑定、非绑定方法

类的继承、派生、覆盖、super()python类的继承:子类继承父类,只需要在定义类的时候在类名后面加上(父类名)。继承之后,父类的属性方法、子类都可以访问派生:子类继承父类后,自己在父类的基础上,又添加了一些属于自己特性的属性、方法

Java的类继承

知识点1、继承作用:提高代码的重用性,继承之后子类可以继承父类中的属性和方法减少重复代码条件:子类和父类要满足isa的逻辑关系,才能使用继承。如:苹果isa水果语法:使用extends连接子类和父类。子类extends父类Java是单继承,一个类只能继承一个父类。子类不能继承父类私有的属性,但是可以