我正在读Head First Design Patterns书。

有一个讨论Duck基类的示例:

class Duck
{
   public void Quack()
   {
   }

   public void Fly()
   {
   }
}


如果我创建一个子类,它不能像这样飞行:

class CantFlyButQuackDuck : Duck
{
    // I can use base Fly() here, but this kind of duck cannot fly!
}


因此,这本书说这很不好,因为子类不需要飞行,它不必重写任何内容。

但是,如果我不从Child类中调用Fly()没关系。那书为什么说不好呢?我将在我的应用程序中使用该子类,例如:

CantFlyButQuackDuck  myobj= new CantFlyButQuackDuck();
myobj.Quack();

最佳答案

如果子类不具有父类的一个或多个特征,那么将有什么理由使其从父类继承呢?

继承的思想是,基类的所有子代必须共享基类的属性和方法。除此之外,每个孩子可能都有自己的专用属性和方法,并覆盖继承的方法。就您而言,Duck
可以Fly(),所有继承自它的实体也必须如此。仅仅因为您没有在孩子身上称呼Fly并不意味着孩子不会“知道”如何使用Fly()

实际上,这可能是使用接口的好方案。该接口将具有方法Quack(),您的类可以实现该方法。然后,尽管它与Quack共享Duck的功能,但它却不能Fly(),因此也不能继承它,同时仍保留一些共享的功能。

为了说明这一点,假设您有一个Whistle,它也可以是Quack,但不能是Fly。因为按照您的逻辑,在Fly上不调用CantFlyButQuackDuck似乎是合理的,所以在Whistle上也应该同样合理,除了很明显地Whistle绝不是Duck的一种。这意味着您应该寻找的是共享某些属性/方法,而不意味着您的世界模型中存在“ X是Y”关系。

09-28 08:46