Java中inheritance的坏例子是什么?

我知道Java中inheritance的优点,但我有点难以接受它也有缺点。 任何人都可以在Java中给我一个糟糕的inheritance示例吗?

  • Stack extends Vector 。 堆栈不是矢量。
  • Properties extends Hashtable 。 属性表不是哈希表。

有关Java的报价,请参阅此答案 。

使用Vector已实现的内容(同样适用于Properties )编写Stack实现很容易,但是它产生了问题 – 请参见此处

一个例子是实现常量接口 (仅包含不可变字段的接口)的旧模式,然后希望使用这些常量的类将实现此接口以方便起见。 问题是您的类现在inheritance了此接口的API,并且对其设计的扩展可能会在将来损害您的API。

如今,以这种方式使用恒定接口通常被认为是反模式。 从Java 5开始,您可以使用枚举而不是充满常量和静态导入的接口,而不是定义常量接口。

来自Josh Bloch的Effective Java:

常量接口模式是接口的不良使用。 一个类在内部使用一些常量是一个实现细节。 实现常量接口会导致此实现细节泄漏到类的导出API中。

这里有一篇非常好的文章讨论了Java中inheritance与组合的使用,包括何时以及为何使用其中一个的例子。 这里还有一个采访,讨论了这个主题(引用四人帮的诏书“赞成inheritanceinheritance”)。

它实际上是一个非常广泛的,至少对我来说非常有趣的主题。 许多初学者程序员获得了一些inheritance并开始了一个糟糕的设计路径,并不总是了解多态如何工作以及他们可以利用哪些设计模式和技术来编写更好的软件。 如果你是一个面向对象的程序员,你永远不会学到太多关于多态,接口,inheritance,组合,抽象等的知识。

我相信只要它遵循“is-a”指南并且实施它的人理解它并且不会弄乱它,实际上没有任何缺点。

不成熟是指在没有他人指导的情况下无法使用智力。 伊曼纽尔康德

如果你说:“你很难接受,它也有缺点。”然后我理解为 – 你知道缺点,你有一些道德冲突或思想混乱,这会质疑你的知识本质。 “听”和“听”的方式是两回事,我不能让你明白,如果你不尝试自己。

如果您想了解,请尝试阅读一本书,例如:

  • 有效的Java (第16项):赞成组合而不是inheritance( Link )