Java:一个类可以同时从两个超类inheritance吗?
我有一个课程旅程,我想创建一个超级课程和另一个课程计划之旅。 计划的旅程类扩展了JFrame,因为它包含表单。但是我也希望这个类扩展Journey ..
有可能这样做吗?
不要混合模型和视图。 如果您将两个域明确分开,那么您将不需要多重inheritance(这次)。
您有一个用于旅程的模型类和用于此类旅程的查看器。 查看器应该子类化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
。
Java中没有多重inheritance。 语言不允许这样做。 检查您是否可以将设计更改为使用Interface。 (这几乎总是可能的)。
不,这不可能用Java。 通常,使用接口可以实现类似的效果(我认为Journey可能是这里的接口),但是如果您希望inheritance方法实现,那么您将不得不重新考虑您的设计。
我从你的描述中得到的最好的猜测是你可以将你的类分成一个代表数据模型的层次结构,另一个扩展JFrame来显示数据。
从Sun Java Tutorial的“ inheritance”页面
定义:从另一个类派生的类称为子类(也是派生类,扩展类或子类)。 派生子类的类称为超类(也是基类或父类)。
Excepting Object没有超类, 每个类都有一个且只有一个直接超类(单inheritance) 。 在没有任何其他显式超类的情况下,每个类都隐式地是Object的子类。
类可以从派生自类的类派生的类派生,依此类推,最终派生自最顶层的类Object。 据说这样的类是inheritance链中延伸回Object的所有类的后代。
让Journey
扩展JFrame
或使Journey
成为一个界面。
选择对您的对象结构最有意义的选项。
如果Journey
扩展JFrame
是有意义的,那么就这样做。 这样,当PlannedJourney
扩展Journey
,它还inheritance了Journey
从JFrame
所做的一切。
如果这没有意义,那么让Journey
成为一个界面,并让PlannedJourney
实现Journey
。 PlannedJourney
将无法inheritanceJourney
任何代码,但除了作为JFrame
之外,您还可以inheritance方法签名并将对象作为Journey
传递。
确保在使用Swing时,您正在从视图中分离出模型 。 您的数据应存储在一组对象( Model )中,而Swing组件应显示该数据应该是一组单独的对象( View )。 这有助于封装数据函数,将它们与GUI对象分离,并强制对模型上的View进行单向依赖。 考虑到Journey
对象可能需要显示JourneyFrame
。 通过这种方式, JourneyFrame
可以只显示它,并且可以扩展JFrame
并仅带有对Journey
的引用, Journey
可以有自己的层次结构。
不。在Java中没有多重inheritance。 这是一个刻意的设计决定。
如果您可以找到一种方法来表示其中一个超类作为接口,那么这可能会解决您的问题。
我认为更好的方法可能是让PlannedJourney扩展Journey然后让PlannedJourney拥有一个JFrame实例。 它看起来像是一种用一块石头杀死两只鸟的方法,这取决于你如何看待它。
Java中的多重inheritance是不可能的。
接口的多个实现是可能的,这是Java中最接近多重inheritance的东西。
如果可能的话,赞成组合而不是inheritance。 引自取自Effective Java。
如果你还没有读过Joshua Bloch的“Effective Java”,现在是时候做了。 特别是“赞成组成而不是inheritance”这一节。 由于你不能在Java中做多重inheritance,他解释了为什么在几乎所有情况下,正确的方法是让你的JFrame扩展包含对PlannedJourney的引用,它是用户界面。
不完全确定你想要什么,但多重inheritance是Java中非常可能和常见的事情。 首先,当一个类inheritance自另一个类时,如果该类也是另一个类的子类,它将把它inheritance的方法传递给它的子类。 其次,在Java中有一串编码,也称为“接口”,这允许类从多个类inheritance而不扩展类。