3

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

有没有可能的方法来做到这一点?

4

10 回答 10

4

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

您有一个用于旅程的模型类和一个用于此类旅程的查看器。查看器应该子类化并在您的窗口(一个实例)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的适当位置。

于 2011-01-04T14:01:15.840 回答
3

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

于 2011-01-04T13:18:58.957 回答
2

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

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

于 2011-01-04T13:20:18.840 回答
2

来自Sun Java 教程的继承页面

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

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

类可以从从类派生的类派生的类派生,依此类推,并最终从最顶层的类 Object 派生。据说这样的类是继承链中所有类的后裔,这些类一直延伸到 Object。

于 2011-01-04T13:20:35.430 回答
2

要么做Journey扩展JFrame,要么做Journey一个接口。

选择对您的对象结构最有意义的选项。

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

如果这没有意义,那就做Journey一个接口,并有PlannedJourney实现JourneyPlannedJourney将无法从 继承任何代码Journey,但您将能够继承方法签名并将对象作为 a 和 aJourney传递JFrame


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

于 2011-01-04T13:24:52.797 回答
1

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

于 2011-01-04T16:54:57.387 回答
1

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

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

如果可能的话,支持组合而不是继承。引自 Effective Java。

于 2011-01-04T13:25:47.240 回答
1

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

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

于 2011-01-04T13:19:42.650 回答
1

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

于 2011-01-04T13:23:38.263 回答
0

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

于 2013-05-20T20:13:48.057 回答