我正在阅读 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!
}
所以,这本书说它很糟糕,因为子类不需要飞行,它必须覆盖任何东西。
但是如果我不调用
Fly()
从 Child 类它没关系。那为什么书上说不好呢?我将在我的应用程序中使用这个子类,例如:CantFlyButQuackDuck myobj= new CantFlyButQuackDuck();
myobj.Quack();
最佳答案
如果子类不共享父类的一个或多个特征,那么有什么理由让它从父类继承呢?
继承背后的想法是基类的属性和方法必须由它的所有子类共享。除此之外,每个 child 都可能有自己的特殊属性和方法,以及覆盖继承的方法。在您的情况下,Duck
可以Fly()
,所有从它继承的实体也必须如此。只是因为你不叫它Fly
在 child 身上并不意味着 child 不“知道”如何Fly()
.
事实上,这可能是一个使用接口(interface)的好场景。这个接口(interface)会有一个方法Quack()
,你的类可以实现。然后,虽然它与 Quack
共享能力与 Duck
,无法Fly()
,所以没有继承它,同时仍然保留一些共享的能力。
从这个角度来看,假设您有一个 Whistle
也可以Quack
,但不是 Fly
.由于没有调用Fly
在 CantFlyButQuackDuck
按照您的逻辑似乎是合理的,在 Whistle
上应该同样合理, 除了很明显 Whistle
绝不是一种 Duck
.这意味着您应该寻找的是共享某些属性/方法,而不是在您的世界模型中暗示“X 是 Y”关系。
关于java - 为什么学习基类能力不好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24281968/