【问题标题】:What can be the bad example of inheritance in Java?Java中继承的坏例子是什么?
【发布时间】:2011-07-19 02:49:18
【问题描述】:

我知道继承在 Java 中的优点,但我有点难以接受它也有缺点。谁能给我一个Java继承的坏例子?

【问题讨论】:

    标签: java oop inheritance


    【解决方案1】:

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

    如今,以这种方式使用常量接口通常被认为是一种反模式。从 Java 5 开始,您可以使用 enums 代替充满常量的接口和使用 static imports 代替定义常量接口。

    来自Effective Java by Josh Bloch:

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

    【讨论】:

    • 哇,我如此很高兴在我的各种棕地软件项目中从未遇到过这种情况......
    【解决方案2】:

    不成熟是不能使用 一个人的智力没有 另一个人的指导。 伊曼纽尔·康德

    如果你说:“你很难接受,它也有缺点。”那我理解为 - 你知道缺点,你有一些道德冲突或思想混乱,质疑你的知识本质.就像“听”和“听”一样,是两个不同的东西,如果你不自己尝试,我无法让你理解。

    如果你想了解,试着读一本书,例如:

    • Effective Java(第 16 条):支持组合胜于继承 (Link)

    【讨论】:

      【解决方案3】:

      有一篇很好的文章here 讨论了 Java 中继承与组合的使用,包括何时以及为何使用其中一个的示例。还有一个采访here 讨论了这个主题(参考Gang of Four 法令“支持组合而不是继承”)。

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

      【讨论】:

        【解决方案4】:
        • Stack extends Vector。堆栈不是向量。
        • Properties extends Hashtable。属性表不是哈希表。

        请参阅 this answer 以获取来自 Effective Java 的报价。

        使用VectorProperties 也是如此)中已经实现的内容来编写Stack 实现很容易,但它会产生问题 - see here

        【讨论】:

          【解决方案5】:

          我相信只要它遵循“is-a”指南并且实施它的人理解它并且不会把它弄得一团糟,就没有任何缺点。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-19
            • 1970-01-01
            • 2011-06-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-03
            • 2012-08-01
            相关资源
            最近更新 更多