This question already has answers here:
Prefer composition over inheritance?
(32个答案)
5年前关闭。
我正在阅读有关Java中的Strategy设计模式的信息。问题设置如下
您有一个鸭子班和几种鸭子。您必须对鸭子的飞行和嘎嘎行为进行编码。显然,您无法在每种鸭子类方法中编写飞行,非飞行行为的代码,特别是如果您喜欢100种不同的鸭子。因此,您将创建一个名为
我不明白的是为什么必须使用合成来完成它,为什么不使用继承来完成。为什么不能创建子类lke
我有点困惑。座右铭是“偏重于继承而不是继承”。为什么呢
有人可以深入解释吗?
(32个答案)
5年前关闭。
我正在阅读有关Java中的Strategy设计模式的信息。问题设置如下
您有一个鸭子班和几种鸭子。您必须对鸭子的飞行和嘎嘎行为进行编码。显然,您无法在每种鸭子类方法中编写飞行,非飞行行为的代码,特别是如果您喜欢100种不同的鸭子。因此,您将创建一个名为
FlyingBehavior
和QuackingBehavior
的行为接口,并具有诸如NonFlyingBehavior
或FlyWithWingsBehavior
或MuteQuackBehavior
或SqueakQuackBehavior
的实现。然后将它们放在不同类别的鸭子的字段中。这样,您就可以将行为与鸭子相关联。我不明白的是为什么必须使用合成来完成它,为什么不使用继承来完成。为什么不能创建子类lke
NonFlyingDuck
,FlyWithWingsDuck
或SqueakingDuck
,MuteQuackingDuck
等,然后实现方法fly()
或quack()
,然后为鸭子指定适当的行为。这是因为不支持多重继承。因此,如果您有一只不能飞的吱吱叫的鸭子,那么您就不能同时扩展squeakingDuck
和NonFlyingDuck
还是其他东西。有一些通过继承做到这一点的方法吗?我有点困惑。座右铭是“偏重于继承而不是继承”。为什么呢
有人可以深入解释吗?
最佳答案
我不了解深入的解释,但是为什么在这种情况下不使用继承很容易。因为Java不支持多重继承。
想象一下,在创建了4个类(NonFlyingDuck FlyWithWingsDuck或SqueakingDuck,MuteQuackingDuck)之后,您需要添加其他行为吗? (就像我不知道的那样,CodingDuck)。好了,您将以8个班级结束,每个CodingDuckBehavior班级2个班级(有些鸭子懂得如何做,有些鸭子不懂得如何做)。但是为什么要在这里停下来?您可能对每种行为都有多种实现,这使继承变得不可行。
如果您可以动手使用Head First Design Patterns,我发现他们的Strategy模式示例确实经过深思熟虑(它为您提供了继承路径出错的示例)。
09-11 20:08