为什么不应该扩展JFrame和其他组件?

27

我在此看到这个问题出现了几次,但在我看到的帖子中,没有人解释。为什么我不应该扩展JFrame(或任何组件)?是否存在应该扩展组件的情况,还是这是一个严格的规则,不允许这样做?

5个回答

25

通常来说,扩展组件往往是为了严格使用该组件。这种方式在设计方面以不必要的方式严重限制了您的选择,使得您的类无法扩展不同的类,您也无法隐藏JFrame的方法,这会使其更难于维护,并在使用该类时容易触发意外错误。

通常的意图是仅仅使用该类来绘制一个框架,而组合优于继承。

话虽如此,当您打算让子类添加特定于项目的功能到Frame(例如方便的方法等),并且子类将被用于代替Frame本身,但通常作为框架而不是应用程序中特定框架的视图时,可以使用子类化。


11

更倾向于组合而非继承,这是常见的做法。组合可以减少代码之间的依赖关系。

Swing 和事件 AWT 组件非常复杂,你不想陷入这样的混乱中。你可能会意外地轻易地覆盖方法。在需要覆盖方法的情况下,如果是位于正常代码中,很难看出来。


4
isValid是一个经典的用于意外重写(overriding)的函数。 - willcodejavaforfood

4

如果你的应用程序确实只是一个JFrame,那么就可以扩展它。但是,如果你只是使用JFrame,最好使用对象组合而不是继承。

例如,如果你的对象扩展了其他对象,你就没有选择余地。


1
同意。这是swing,您必须扩展组件以获得绘画行为。 - akarnokd
2
我们可以在BufferedImage中实现“绘制行为”来获取绘图行为。 - Andrew Thompson

2

只要您扩展了类并且可以保留继承的"is-a"方面,我认为就没有问题。

当您扩展JPanel但您的新对象不是JPanel的真正特化时,这就是您遇到问题的地方。但是如果您创建一个扩展JLabel的新的SpeciallyFormattedJLabel,我认为这没有问题。


0

我知道这是一个旧帖子,但我刚刚看到它,我必须告诉你...使用extended限制了我调用对象某些操作的选项。现在我正在重写代码的一些部分,以消除extended给我带来的影响。除非我正在编写一个单文件程序,否则我不会再次使用extended。


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