【问题标题】:Java: Can a class inherit from two super classes at the same time?Java:一个类可以同时继承两个超类吗?
【发布时间】:2011-06-03 09:37:13
【问题描述】:

我有一个班级旅程,我想创建一个超班级和另一个班级计划旅程。 planjourney 类扩展了 JFrame,因为它包含表单..但是我也希望这个类扩展 Journey..

有没有办法做到这一点?

【问题讨论】:

标签: java inheritance subclass multiple-inheritance superclass


【解决方案1】:

不要混合模型和视图。如果您将两个域明确分开,那么您将不需要多重继承(这次)。

您有一个用于旅程的模型类和一个用于此类旅程的查看器。查看器应该继承Component 并在您的窗口中(某处)显示(JFrame 实例)。

此查看器获取一个旅程对象并显示旅程的属性。仅Journey 就拥有旅程的所有信息,只有观看者知道如何向用户呈现旅程:

 public class PlannedJourney extends JPanel {
   private Journey journey;
   public JourneyViewer(Journey journey) {
     this.journey = journey;

     // build this panel based on the journey object
     // (add labels, subpanels, widgets, ...)
   }
 }

现在您可以创建一个 PlannedJourney 实例并将其添加到应用程序 JFrame 的适当位置。

【讨论】:

    【解决方案2】:

    Java 中没有多重继承。 语言不允许。检查您是否可以更改您的设计以改用接口。 (几乎总是可能的)。

    【讨论】:

    • 总是有可能的,但并不总是最好的解决方案:)
    • 是的,这就是我的意思,因为有时,即使可能,最好对设计三思而后行,而不是颠倒实施。
    【解决方案3】:

    不,这在 Java 中是不可能的。通常,使用接口可以实现类似的效果(我认为 Journey 可能在这里是一个接口),但是如果您希望继承方法实现,那么您将不得不重新考虑您的设计。

    根据您的描述,我最好的猜测是,您可以将您的类分成一个层次结构来表示数据模型,另一个层次结构扩展 JFrame 以显示数据。

    【讨论】:

      【解决方案4】:

      来自Sun Java TutorialInheritance页面

      定义:派生的类 从另一个类被称为 子类(也是派生类, 扩展类或子类)。这 子类所在的类 派生的称为超类(也称为 基类或父类)。

      Object 除外,它没有 超类,每个类都有一个并且 只有一个直接超类(单个 继承)。在没有任何 其他显式超类,每个类 隐含地是 Object 的子类。

      类可以从类派生 派生自以下类 从类派生,依此类推,以及 最终源自最顶层 类,对象。据说这样的课程 是所有班级的后裔 向后延伸的继承链 对象。

      【讨论】:

        【解决方案5】:

        要么使 Journey 扩展 JFrame 要么使 Journey 成为接口。

        选择最适合您的对象结构的选项。

        如果 Journey 扩展 JFrame 有意义,那么就这样做。这样,当PlannedJourney 扩展Journey 时,它也继承了JourneyJFrame 所做的一切。

        如果这没有意义,则将Journey 设为接口,并让PlannedJourney 实现JourneyPlannedJourney 将无法从 Journey 继承任何代码,但您将能够继承方法签名并将对象作为 JourneyJFrame 传递。


        确保在使用 Swing 时将 ModelView 中分离出来。您的数据应该存储在一组对象 (Model) 中,并且显示该数据的 Swing 组件应该是一组单独的对象 (View)。这有助于封装数据函数,将它们与 GUI 对象分开,并强制 ViewModel 的单向依赖。考虑Journey 对象可能需要JourneyFrame 才能显示。这样,JourneyFrame 可以只处理显示它,并且可以扩展JFrame 并且只携带对Journey 的引用,它可以有自己的层次结构。

        【讨论】:

        • 我没有投票,因为最后一段是明智的建议,与第一部分相矛盾。 “偏好组合胜于继承”。
        • 第一部分是回答问题,“一个类可以同时继承两个超类吗?”我觉得实际回答这个问题很重要。第二部分是关于被引用的具体例子的常识性建议。我也不赞同诸如“赞成组合胜过继承”之类的笼统说法。我将永远偏爱有意义的东西而不是没有意义的东西。
        【解决方案6】:

        没有。 Java 中没有多重继承。这是一个深思熟虑的设计决定。

        如果您能找到一种方法将其中一个超类表示为接口,那么这可能会解决您的问题。

        【讨论】:

          【解决方案7】:

          我认为更好的方法可能是让 PlannedJourney 扩展 Journey,然后让 PlannedJourney 拥有一个 JFrame 实例。这看起来像是一种用一块石头杀死两只鸟的方法,这取决于你如何看待它。

          【讨论】:

            【解决方案8】:

            Java 中的多重继承是不可能的。

            接口的多种实现是可能的,这是最接近Java中多重继承的东西。

            如果可能,优先考虑组合而不是继承。引自 Effective Java。

            【讨论】:

              【解决方案9】:

              如果您还没有阅读 Joshua Bloch 的“Effective Java”,那么现在是时候阅读了。特别是“优先组合优于继承”部分。由于您不能在 Java 中进行多重继承,他解释了为什么在几乎所有情况下正确的方法是让您的 JFrame 扩展包含对作为 UI 的 PlannedJourney 的引用。

              【讨论】:

                【解决方案10】:

                不完全确定您想要什么,但多重继承在 Java 中是一种非常可能且常见的事情。首先,当一个类从另一个类继承时,如果该类也是另一个类的子类,它将把继承的方法传递给它的子类。其次,在 Java 中有一个编码字符串,也称为“接口”,这允许一个类从多个类继承而无需扩展一个类。

                【讨论】:

                • 多重继承意味着有多个直接超类的可能性。 java中没有这样的东西。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-06-05
                • 2014-09-12
                • 2013-12-11
                • 1970-01-01
                相关资源
                最近更新 更多