C#继承机制的具体实现(附带实例)
继承是面向对象编程最重要的特性之一,它源于人们认识客观世界的过程,是自然界普遍存在的一种现象。
比如,我们每一个人都从祖辈和父母那里继承了一些体貌特征,但是每个人却又不同于父母,因为每个人都存在自己的一些特性,这些特性是独有的,在父母身上并没有体现。
在程序设计中实现继承,表示这个类拥有它继承的类的所有公有成员或者受保护成员。在面向对象编程中,被继承的类称为父类或基类,实现继承的类称为子类或派生类。
例如,平行四边形是特殊的四边形,可以说平行四边形类继承了四边形类,这时平行四边形类将所有四边形具有的属性和方法都保留下来,并基于四边形类扩展一些新的平行四边形类特有的属性和方法。
下面演示一下继承性。创建一个新类 Test,同时创建另一个新类 Test2 继承 Test 类,其中包括重写的基类成员方法和新增成员方法等。在下图中描述了类 Test 与 Test2 的结构以及两者的关系。

图 1 Test与Test2的结构及两者的关系
C# 中使用“:”来标识两个类的继承关系。继承一个类时,类成员的可访问性是一个重要的问题。派生类(子类)不能访问基类的私有成员,但是可以访问其公共成员。这就是说,只要使用 public 声明类成员,就可以让一个类成员被基类和派生类(子类)同时访问,也可以被外部的代码访问。
另外,为了解决基类成员的访问问题,C# 还提供了另外一种可访问性:protected,它表示受保护的成员,只有父类和派生类(子类)才能访问 protected 成员,外部代码不能访问 protected 成员。
【实例】创建一个控制台应用程序,模拟实现进销存管理系统的进货信息并输出。首先自定义一个 Goods 类,该类中定义两个公有属性,表示商品编号和名称;然后自定义 JHInfo 类,继承自 Goods 类,在该类中定义进货编号属性,以及输出进货信息的方法;最后在 Pragram 类的 Main 方法中创建派生类 JHInfo 的对象,并使用该对象调用基类 Goods 中定义的公有属性。代码如下:
C# 中只支持单继承,而不支持多重继承,即在 C# 中一次只允许继承一个类,不能同时继承多个类,例如,下面的代码是错误的:

图 2 继承多个类时出现的错误提示
此外在实现类的继承时,子类的可访问性一定要低于或者等于父类的可访问性。例如,下面的代码是错误的:

图 3 子类可访问性高于父类时出现的错误提示
比如,我们每一个人都从祖辈和父母那里继承了一些体貌特征,但是每个人却又不同于父母,因为每个人都存在自己的一些特性,这些特性是独有的,在父母身上并没有体现。
在程序设计中实现继承,表示这个类拥有它继承的类的所有公有成员或者受保护成员。在面向对象编程中,被继承的类称为父类或基类,实现继承的类称为子类或派生类。
C#继承的实现
继承的基本思想是基于某个基类的扩展,制定出一个新的派生类,派生类可以继承基类原有的属性和方法,也可以增加原来基类所不具备的属性和方法,或者直接重写基类中的某些方法。例如,平行四边形是特殊的四边形,可以说平行四边形类继承了四边形类,这时平行四边形类将所有四边形具有的属性和方法都保留下来,并基于四边形类扩展一些新的平行四边形类特有的属性和方法。
下面演示一下继承性。创建一个新类 Test,同时创建另一个新类 Test2 继承 Test 类,其中包括重写的基类成员方法和新增成员方法等。在下图中描述了类 Test 与 Test2 的结构以及两者的关系。

图 1 Test与Test2的结构及两者的关系
C# 中使用“:”来标识两个类的继承关系。继承一个类时,类成员的可访问性是一个重要的问题。派生类(子类)不能访问基类的私有成员,但是可以访问其公共成员。这就是说,只要使用 public 声明类成员,就可以让一个类成员被基类和派生类(子类)同时访问,也可以被外部的代码访问。
另外,为了解决基类成员的访问问题,C# 还提供了另外一种可访问性:protected,它表示受保护的成员,只有父类和派生类(子类)才能访问 protected 成员,外部代码不能访问 protected 成员。
注意,派生类(子类)不能继承基类中所定义的 private 成员。
【实例】创建一个控制台应用程序,模拟实现进销存管理系统的进货信息并输出。首先自定义一个 Goods 类,该类中定义两个公有属性,表示商品编号和名称;然后自定义 JHInfo 类,继承自 Goods 类,在该类中定义进货编号属性,以及输出进货信息的方法;最后在 Pragram 类的 Main 方法中创建派生类 JHInfo 的对象,并使用该对象调用基类 Goods 中定义的公有属性。代码如下:
class Goods { public string TradeCode { get; set; } //定义商品编号 public string FullName { get; set; } //定义商品名称 } class JHInfo : Goods //继承Goods类 { public string JHID { get; set; } //定义进货编号 public void showInfo() //输出进货信息 { Console.WriteLine("进货编号:{0}\n商品编号:{1}\n商品名称:{2}", JHID, TradeCode, FullName); } } class Program { static void Main(string[] args) { JHInfo jh = new JHInfo(); //创建JHInfo对象 jh.TradeCode = "T100001"; //设置基类中的TradeCode属性 jh.FullName = "笔记本电脑"; //设置基类中的FullName属性 jh.JHID = "JH00001"; //设置JHID属性 jh.showInfo(); //输出信息 Console.ReadLine(); } }程序运行结果为:
进货编号:JH00001
商品编号:T100001
商品名称:笔记本电脑
C# 中只支持单继承,而不支持多重继承,即在 C# 中一次只允许继承一个类,不能同时继承多个类,例如,下面的代码是错误的:
class Goods { } class JHInfo : Goods //正确:继承单个类 { } class Program : Goods, JHInfo //错误:继承多个类 { }上面的代码在 Visual Studio 2022 开发环境中将会出现如下图所示的错误提示:

图 2 继承多个类时出现的错误提示
此外在实现类的继承时,子类的可访问性一定要低于或者等于父类的可访问性。例如,下面的代码是错误的:
class Goods { } public class JHInfo : Goods { }因为父类 Goods 声明时没有指定访问修饰符,则其默认访问级别为 private,而子类 JHInfo 的可访问性 public 要高于父类 Goods 的可访问性,因此会出现如下图所示的错误提示。

图 3 子类可访问性高于父类时出现的错误提示