Java中继承的一个不好的例子是什么?

5

我知道Java中继承的优点,但是很难接受它也有缺点。有人能否给我一个Java中继承的不好的例子呢?

5个回答

8
  • Stack 扩展了 Vector。栈不是向量。
  • Properties 扩展了 Hashtable。属性表不是哈希表。

参见《Effective Java》的这篇回答

使用已有的 Vector 实现 Stack(也是同样的道理,实现 Properties),本来容易实现,但会产生问题 - 参见这里


5
一个例子是旧的实现模式常量接口(只包含不可变字段的接口),然后希望使用这些常量的类会实现此接口以方便使用。问题在于,您的类现在继承了此接口的API,并且对其设计的扩展可能会损害您的API。
如今,以这种方式使用常量接口通常被认为是反模式。自Java 5以来,您可以使用枚举而不是充满常量的接口,使用静态导入而不是定义常量接口。
来自Josh Bloch的Effective Java:

常量接口模式是接口的糟糕用法。类在内部使用某些常量是实现细节。 实现常量接口会导致此实现细节泄漏到类的导出API中。


哇,我太高兴了,在我的各种棕地软件项目中从未遇到过这种情况... - David

4

这里有一篇不错的文章(链接在此),讨论了Java中继承与组合的使用,包括何时以及为什么使用其中之一的例子。 还有一次采访(链接在此),讨论了这个主题(提到了四人帮的指导原则“优先使用组合而不是继承”)。

实际上,这是一个非常广泛且对我来说非常有趣的主题。很多初学者程序员开始使用继承并走向糟糕的设计路线,他们并不总是学习多态性如何工作以及可以利用哪些设计模式和技术编写更好的软件。如果您是面向对象的程序员,则永远无法学习太多关于多态性、接口、继承、组合、抽象等方面的知识。


1

我相信只要遵循“是一个”的准则,并且实施人员理解并不会搞砸,就没有什么缺点。


1

不成熟是指在没有他人指导的情况下无法运用自己的智慧。——伊曼纽尔·康德

如果你说:“你很难接受它也有缺点。”,那么我理解为-你知道缺点,但你有一些道德冲突或思想混乱,这些问题质疑你的知识本质。就像“听”和“倾听”是两回事一样,如果你不尝试自己去理解,我无法让你明白。

如果你想要理解,可以尝试阅读一本书,例如:

  • Effective Java(第16项):优先使用组合而非继承(链接

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接