【发布时间】:2014-05-14 01:18:27
【问题描述】:
我正在阅读 Java 中的策略设计模式。问题设置如下
你有一个鸭子类和几种鸭子。您必须对鸭子的飞行和嘎嘎行为进行编码。您显然不能在每个鸭类方法中对飞行、非飞行行为进行编码,尤其是如果您有 100 种不同种类的鸭子。因此,您创建了一个名为FlyingBehavior 和QuackingBehavior 的行为接口,并具有NonFlyingBehavior 或FlyWithWingsBehavior 或MuteQuackBehavior 或SqueakQuackBehavior 之类的实现。然后将这些设置在不同类别的鸭子的字段中。这样你就可以将行为与鸭子联系起来。
我不明白为什么它必须通过组合来完成,而为什么不能通过继承来完成。为什么不能创建NonFlyingDuck、FlyWithWingsDuck 或SqueakingDuck、MuteQuackingDuck 等子类,然后实现fly() 或quack() 方法,然后为鸭子分配适当的行为。这是因为不支持多重继承。所以如果你有一只不会飞的、吱吱叫的鸭子,那么你不能同时扩展squeakingDuck 和NonFlyingDuck 或者是别的什么东西。有没有办法通过继承来做到这一点?
我感到有些困惑。座右铭是“优先组合胜过继承”。为什么呢?
有人能详细解释一下吗?
【问题讨论】:
-
这是来自 Head First 设计模式吗?因为他们有一个类似的例子以及首选解决方案的所有原因。当我找到它时会放在这里。
-
我想说...你读过整本书吗?他们在 Head First Design Patterns 中很好地解释了这一点
-
它来自 Head Fist 设计模式。问题显然是多重继承。谢谢大家的帮助。
-
在支持多重继承的语言中,这对继承来说是相当容易的,但是在像 Java 这样你只有一个超类的语言中,你必须开始对类做出一些随意的决定层次顺序。
-
无论如何你都应该避免多重继承 - stackoverflow.com/questions/406081/…
标签: java design-patterns inheritance