13.10 子类和派生

当类之间有显著的不同,并且(较小的类)是较大的类所需要的组件时,组合表现得很好,但当你设计“相同的类但有一些不同的功能”时,派生就是一个更加合理的选择了。

OOP的更强大功能之一是能够使用一个已经定义好的类,扩展它或者对其进行修改,而不会影响系统中使用现存类的其他代码片段。OOD允许类特征在子孙类或子类中进行继承。这些子类从基类(或称祖先类、超类)继承它们的核心属性。而且,这些派生可能会扩展到多代。在一个层次的派生关系中的相关类(或者是在类树图中垂直相邻)是父类和子类关系。从同一个父类派生出来的这些类(或者是在类树图中水平相邻)是同胞关系。父类和所有高层类都被认为是祖先。

使用前一节中的例子,如果我们必须创建不同类型的地址本,即不仅仅是创建地址本的多个实例,在这种情况下,所有对象几乎是相同的。如果我们希望EmplAddrBookEntry类中包含更多与工作有关的属性,如员工ID和电子邮件地址呢?这跟PersonalAddrBookEntry类不同,它包含更多基于家庭的信息,比如家庭地址、关系、生日等。

两种情况下,我们都不想到从头开始设计这些类,因为这样做会重复创建通用的AddressBook类时的操作。包含AddressBook类所有的特征和特性并加入需要的定制特性不是很好吗?这就是类派生的动机和要求。

创建子类

创建子类的语法看起来与普通(新式)类没有区别,一个类名,后跟一个或多个需要从其中派生的父类:

13.10 子类和派生 - 图1

如果你的类没有从任何祖先类派生,可以使用object作为父类的名字。经典类的声明唯一不同之处在于其没有从祖先类派生——此时,没有圆括号:

13.10 子类和派生 - 图2

至此,我们已经看到了一些类和子类的例子,下面还有一个简单的例子:

13.10 子类和派生 - 图3

13.10 子类和派生 - 图4