This question already has answers here:
Prefer composition over inheritance?
                                
                                    (32个答案)
                                
                        
                                5年前关闭。
            
                    
我正在阅读有关Java中的Strategy设计模式的信息。问题设置如下

您有一个鸭子班和几种鸭子。您必须对鸭子的飞行和嘎嘎行为进行编码。显然,您无法在每种鸭子类方法中编写飞行,非飞行行为的代码,特别是如果您喜欢100种不同的鸭子。因此,您将创建一个名为FlyingBehaviorQuackingBehavior的行为接口,并具有诸如NonFlyingBehaviorFlyWithWingsBehaviorMuteQuackBehaviorSqueakQuackBehavior的实现。然后将它们放在不同类别的鸭子的字段中。这样,您就可以将行为与鸭子相关联。

我不明白的是为什么必须使用合成来完成它,为什么不使用继承来完成。为什么不能创建子类lke NonFlyingDuckFlyWithWingsDuckSqueakingDuckMuteQuackingDuck等,然后实现方法fly()quack(),然后为鸭子指定适当的行为。这是因为不支持多重继承。因此,如果您有一只不能飞的吱吱叫的鸭子,那么您就不能同时扩展squeakingDuckNonFlyingDuck还是其他东西。有一些通过继承做到这一点的方法吗?

我有点困惑。座右铭是“偏重于继承而不是继承”。为什么呢

有人可以深入解释吗?

最佳答案

我不了解深入的解释,但是为什么在这种情况下不使用继承很容易。因为Java不支持多重继承。
想象一下,在创建了4个类(NonFlyingDuck FlyWithWingsDuck或SqueakingDuck,MuteQuackingDuck)之后,您需要添加其他行为吗? (就像我不知道的那样,CodingDuck)。好了,您将以8个班级结束,每个CodingDuckBehavior班级2个班级(有些鸭子懂得如何做,有些鸭子不懂得如何做)。但是为什么要在这里停下来?您可能对每种行为都有多种实现,这使继承变得不可行。
如果您可以动手使用Head First Design Patterns,我发现他们的Strategy模式示例确实经过深思熟虑(它为您提供了继承路径出错的示例)。

09-11 20:08