我正在读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”关系。