我想询问一下关于这本书里的鸭子例子,让我感到困惑并感觉有矛盾。
问题
结论
他说:“当乔向鸭子超类添加新行为时,他同时也添加了一些不适合某些鸭子子类的行为”。
但是在结论中,他添加了performFly()
和performQuack();
。这有什么不同?因为我认为它与他同时也添加了一些不适合某些鸭子子类的行为相同?
**图片摘自《Head First设计模式》。 ** 这个问题并没有说明这本书不好,在我看来这本书非常好。这只是我在询问我没有从书中理解的内容。
我想询问一下关于这本书里的鸭子例子,让我感到困惑并感觉有矛盾。
问题
结论
他说:“当乔向鸭子超类添加新行为时,他同时也添加了一些不适合某些鸭子子类的行为”。
但是在结论中,他添加了performFly()
和performQuack();
。这有什么不同?因为我认为它与他同时也添加了一些不适合某些鸭子子类的行为相同?
**图片摘自《Head First设计模式》。 ** 这个问题并没有说明这本书不好,在我看来这本书非常好。这只是我在询问我没有从书中理解的内容。
没有客户端应该被强制依赖于它不使用的方法
因为有些不会飞的鸭子实现了fly()方法,即使它们不需要它。 也就是说,在这种情况下,无法避免地要实现所有接口方法,因为在客户端我们使用了多态行为,需要确保即使未使用也有所有方法可用。
fly()
函数的新类。然而,这个函数并不总是让鸭子飞行。橡皮鸭不能飞行,因此它们使用FlyNoWay
类的实例。其他可以飞行的鸭子使用FlyWithWings
类的实例。在Duck
类中的flyBehavior
字段可能会在构造函数中设置。
performFly()
函数将调用所选择的任何类的fly()
函数。WildDuckBehavior
类和一个DomesticDuckBehavior
类,每个类都有自己的关于如何行动的信息。基本上,书中的例子是这种用法的简化版本。class Duck
{
swim();
}
class MallardDuck : IFlyable
{
fly();
}
class RedheadDuck : IFlyable, IQuackable
{
fly();
quack();
}