第10章 继承

在第9章中学习了面向对象编程的核心概念之一:类。C#是一种面向对象的语言,从本章开始,我们将逐个学习面向对象编程的基本特征,本章要从继承性开始讨论。继承机制可以提高软件模块的可复用性和可扩展性,以提高软件开发效率。

10.1 类的继承

C#和C++不同,可以从一个类继承或实现多个接口,但不可以从多个类继承。新定义的派生类的实例可以继承已有的基类的特征和能力。

如果从其他的类继承,语法也很简单,只需在声明类时,在类名后加一个冒号,然后在冒号后指定要继承的类即可,如代码清单10-1所示。

代码清单10-1 类的继承语法

第10章 继承 - 图1

下面我们解释一下与继承性相关的两个概念:

❑基类:被继承的类,又称做父类。实际上,基类和派生类也只是一个相对的概念,Automobile(汽车)在此处是基类,但它同时也是一个派生类,因为任何类都继承自Object类,都是Object类型的派生类型。

❑派生类:继承自基类的类,又称做子类。派生类不但有自身的成员,还包含了基类的成员。我们还是以奔驰和汽车的关系举例,首先,奔驰汽车是汽车的一种,如果不把汽车作为基类抽象出来,那么势必会造成奔驰汽车、宝马汽车、奇瑞汽车等具有重复的性质,既造成无谓的冗余,又不利于数据复用及统一管理。因此,可以先定义一个代表汽车的基类Automobile,Automobile类作为基类,体现了“汽车”这个实体具有的公共性质:这里只拿鸣笛和行驶举例(对应两个方法:Beep()和Run()),然后定义代表奔驰汽车的派生类Benz,它派生自汽车类,如代码清单10-2所示。

代码清单10-2 类继承示例


class Automobile

{

//鸣喇叭

public void Beep(){}

//行驶

public void Run(){}

}

class Benz:Automobile

{

}


基类和派生类的关系可以使用UML进行表示,如图10-1所示。

第10章 继承 - 图2

图 10-1 Car类和Benz类的继承关系图

这里虽然我们并没有为Benz类定义任何成员方法,但实际上,Benz类已经继承了它的基类Automobile类的所有非私有成员(私有成员只有Automobile类自身可以访问),这点可以通过图10-2进行验证。

第10章 继承 - 图3

图 10-2 Visual Studio的IntelliSense显示基类的非私有成员

由图10-2可见,我们虽然没有为Benz类定义任何成员,但仍然可以使用其基类的非私有成员,如Beep方法和Run方法,除了这两个从Automobile类继承过来的方法以外,还有从Object类型继承的方法成员,下面对IntelliSense列出的方法逐个进行说明,此处仅为说明,故忽略了各方法的参数,如表10-1所示。

第10章 继承 - 图4