August 2021
Intermediate to advanced
450 pages
4h 46m
Chinese
不论你是否完全相信关于组合优于继承的说法,下面我们展示一个直接使用继承的例子,探索一下是否可以通过组合的方式实现。回顾在整本书里我们都提到过的哺乳动物的例子。在这里,我们加入一个新的可以飞的哺乳动物——蝙蝠,如图11.1所示。
图11.1 使用继承创建哺乳动物
在这个例子中,继承看起来是很明显的选择。从Mammal类继承创建一个Dog类是显而易见的。请看下面使用继承实现的代码。
在这个设计里,一个哺乳动物只有单个行为,eat(),假设所有的哺乳动物都必须进食。然而,当我们增加两个Mammal子类:Bat和Dog,就能看出继承的问题。虽然狗能走路,但并不是所有的哺乳动物能够走路。此外,蝙蝠虽然可以飞行,但其他的哺乳动物不一定能飞行。所以问题在于,这些方法要放在哪里?就像之前提到的企鹅的例子,并不是所有的鸟都会飞,所以如何在继承的层级里放置这些方法是非常棘手的。
将Mammal类拆分为FlyingMammals类和WalkingMammals类并不是一种优雅的解决方案,因为这只不过是冰山一角,一些哺乳动物可以游泳,一些甚至可以产卵。此外,对于单个种类哺乳动物可能有无数种行为,为每种行为都创建一个单独的类是不实际的。因此,比起用is-a这样的关系去设计,可能我们更应该使用has-a这样的关系。 ...
Read now
Unlock full access