java - 为什么学习基类能力不好

标签 java c# inheritance design-patterns

我正在阅读 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 .由于没有调用FlyCantFlyButQuackDuck按照您的逻辑似乎是合理的,在 Whistle 上应该同样合理, 除了很明显 Whistle绝不是一种 Duck .这意味着您应该寻找的是共享某些属性/方法,而不是在您的世界模型中暗示“X 是 Y”关系。

关于java - 为什么学习基类能力不好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24281968/

相关文章:

java - 构建单个 jar

c# - 以编程方式提升权限并尽可能更加用户友好

c# - 暂停程序直到 JSFL 文件完成

typescript - 在 TypeScript 中键入由继承方法调用的重写方法(错误?)

database - 将两个完全不同的类作为一个类

Java 正则表达式 "[.]"与 "."

java - 将其他 Activity (具有两个值)的 Intent 永久保存到 ListView

c# - 解析 xml 并显示节点值时删除 "#text"

C++ 确保子类为常量提供自定义值

c# - 无需手写 JavaScript 的 AJAX Web 应用程序