我知道Java中继承的优点,但我有点难以接受它也有缺点。任何人都可以在Java中给我一个糟糕的继承示例吗?
答案 0 :(得分:7)
Stack extends Vector
。堆栈不是矢量。 Properties extends Hashtable
。属性表不是哈希表。有关Effective Java的报价,请参阅this answer。
使用Stack
中已经实现的内容(同样适用于Vector
)编写Properties
实现很容易,但它产生了问题 - see here
答案 1 :(得分:5)
一个例子是实现constant interfaces(仅包含不可变字段的接口)的旧模式,然后希望使用这些常量的类将实现此接口以方便起见。问题是您的类现在继承了此接口的API,并且对其设计的扩展可能会在将来损害您的API。
如今,以这种方式使用常量接口通常被认为是反模式。从Java 5开始,您可以使用enums而不是充满常量和static imports的接口,而不是定义常量接口。
来自Effective Java by Josh Bloch:
常量接口模式是接口的不良使用。类在内部使用一些常量是一个实现细节。实现常量接口会导致此实现细节泄漏到类的导出API中。
答案 2 :(得分:4)
有一篇非常好的文章here讨论了Java中继承与组合的使用,包括何时以及为何使用其中一个的例子。还有一个访谈here讨论了这个主题(引用Gang of Four法令“赞成合成而不是继承”)。
这实际上是一个非常广泛的,至少对我而言,非常有趣的主题。许多初学者程序员得到了一些继承并开始了一个糟糕的设计路径,并不总是了解多态如何工作以及他们可以利用哪些设计模式和技术来编写更好的软件。如果你是一个面向对象的程序员,你永远不会学到太多关于多态,接口,继承,组合,抽象等的知识。
答案 3 :(得分:1)
我相信只要遵循“is-a”指南并且实施它的人理解它并且不弄乱它就没有任何缺点。
答案 4 :(得分:1)
不成熟是无法使用的 一个人的智力没有 另一个人的指导。 伊曼纽尔·康德
如果你说:“你很难接受,它也有缺点。”,我理解为 - 你知道缺点,你有一些道德冲突或思想混乱,质疑你的知识本质。 “听”和“听”的方式是两回事,如果你不尝试自己,我无法让你明白。
如果您想了解,请尝试阅读一本书,例如: