【发布时间】:2011-07-19 02:49:18
【问题描述】:
我知道继承在 Java 中的优点,但我有点难以接受它也有缺点。谁能给我一个Java继承的坏例子?
【问题讨论】:
标签: java oop inheritance
我知道继承在 Java 中的优点,但我有点难以接受它也有缺点。谁能给我一个Java继承的坏例子?
【问题讨论】:
标签: java oop inheritance
一个例子是实现constant interfaces(一个只包含不可变字段的接口)的旧模式,为了方便起见,希望使用这些常量的类将实现这个接口。问题是您的类现在继承了此接口的 API,并且对其设计的扩展可能会在将来损害您的 API。
如今,以这种方式使用常量接口通常被认为是一种反模式。从 Java 5 开始,您可以使用 enums 代替充满常量的接口和使用 static imports 代替定义常量接口。
来自Effective Java by Josh Bloch:
常量接口模式是对接口的不良使用。一个类在内部使用一些常量是一个实现细节。实现一个常量接口会导致这个实现细节泄漏到类的导出 API 中。
【讨论】:
不成熟是不能使用 一个人的智力没有 另一个人的指导。 伊曼纽尔·康德
如果你说:“你很难接受,它也有缺点。”那我理解为 - 你知道缺点,你有一些道德冲突或思想混乱,质疑你的知识本质.就像“听”和“听”一样,是两个不同的东西,如果你不自己尝试,我无法让你理解。
如果你想了解,试着读一本书,例如:
【讨论】:
有一篇很好的文章here 讨论了 Java 中继承与组合的使用,包括何时以及为何使用其中一个的示例。还有一个采访here 讨论了这个主题(参考Gang of Four 法令“支持组合而不是继承”)。
这是一个非常广泛的,至少对我来说,实际上是非常有趣的主题。许多初级程序员得到了一些继承,并开始走上一条糟糕的设计之路,并不总是学习多态性是如何工作的,以及他们可以利用哪些设计模式和技术来编写更好的软件。如果你是一个面向对象的程序员,你永远不会学到太多关于多态性、接口、继承、组合、抽象等方面的知识。
【讨论】:
Stack extends Vector。堆栈不是向量。 Properties extends Hashtable。属性表不是哈希表。请参阅 this answer 以获取来自 Effective Java 的报价。
使用Vector(Properties 也是如此)中已经实现的内容来编写Stack 实现很容易,但它会产生问题 - see here
【讨论】:
我相信只要它遵循“is-a”指南并且实施它的人理解它并且不会把它弄得一团糟,就没有任何缺点。
【讨论】: