
上QQ阅读APP看书,第一时间看更新
1.9.2 抽象
继承树可能会增长得非常庞大。当Mammal和Cat类完成后,可以快速添加其他哺乳动物(比如狗,或者狮子、老虎和熊)。Cat类也可以作为其他类的父类,比如作为波斯猫、暹罗猫等猫的父类。而Dog类也可以作为德国牧羊犬和鬈毛狗的父类(见图1.15)。继承的力量在于它的抽象和组织技术。

图1.15 Mammal UML图
太多的抽象层是很多开发者对于使用继承的谨慎的原因。常见的情况下,我们很难决定要抽象到什么程度。比如说,企鹅是鸟类,鹰也属于鸟类,它们是否应该都继承自一个带有fly方法的Bird类呢?
在大多数最新的面向对象的语言中(比如Java、.Net和Swift),一个类只能有一个父类,然而一个类可以有多个子类。另一些语言中,比如C++可以拥有多个父类。前一种情况称为单继承,后一种情况称为多重继承。
多重继承
考虑到一个孩子继承双亲的特征。那么这个孩子的眼睛应该继承自谁?这对于编译器来说是个非常重要的问题。C++允许多重继承,很多语言则不允许。
请注意GermanShepherd(德国牧羊犬)类和Poodle(鬈毛狗)类都继承自Dog类。每个类只有一个方法。然而由于它们继承自Dog,所以它们也继承自Mammal。即GermanShepherd和Poodle类获取了Dog和Mammal中所有的属性和方法,同时也拥有它们自身的属性和方法(如图1.16所示)。

图1.16 Mammal继承体系图