Inheritance 基于GUI的组合继承

Inheritance 基于GUI的组合继承,inheritance,coding-style,composition,Inheritance,Coding Style,Composition,这个问题基本上是语言不明确,但针对使用OOP并有可能创建GUI的语言。 不过,如果需要提供示例,我将使用Java作为参考 正如干净的代码告诉我们的那样,组合要优于继承。 现在有很多关于这个主题的博客文章,有些是针对GUI开发的。 到目前为止,我读过的最“重要”(对那些家伙来说)的一句话是“不要从JFrame/JDialog派生” 另一方面,有一条规则将其视为“is-a vs has-a”,其中“has-a”表示组合,“is-a”明确表示继承。 现在这里的问题是:当我开发一个具有GUI的应用程序时

这个问题基本上是语言不明确,但针对使用OOP并有可能创建GUI的语言。
不过,如果需要提供示例,我将使用Java作为参考

正如干净的代码告诉我们的那样,组合要优于继承。
现在有很多关于这个主题的博客文章,有些是针对GUI开发的。
到目前为止,我读过的最“重要”(对那些家伙来说)的一句话是“不要从JFrame/JDialog派生”

另一方面,有一条规则将其视为“is-a vs has-a”,其中“has-a”表示组合,“is-a”明确表示继承。
现在这里的问题是:当我开发一个具有GUI的应用程序时,这个GUI就是一个JFrame或JDialog(或者是针对特定编程语言的任何东西,例如,
System.Windows.Forms.Forms
for.NET Windows Forms)。然后,此GUI具有多个控件

对我来说,情况很清楚:
我的应用程序使用组合来创建GUI实例,但GUI本身使用继承,因为它是一个JFrame,然后此GUI再次使用组合来创建其中的控件。
我决不会想到在GUI上使用Compision,就像在我的GUI上有一个GUI管理器,它拥有JFrameGUI的所有控件,然后构建(如:将其放在一起)并显示它一样。毕竟,控件是GUI的一部分,所以应该是GUI的成员变量?!(仅当GUI使用继承时才可能)。
更清楚的是:是的,我的GUI应该像JFrame一样工作,如果需要的话,应该像JFrame一样被其他开发人员使用

现在,问题是:
在这种情况下,正确的方法是什么?
我的看法完全错了吗


提前感谢您对此的任何意见。

编程既是一门艺术,也是一门科学。在这方面,不一定有一个单一的最佳方式来实现一个结果,这取决于你比较的利弊

“组合优先于继承”是一个指导原则:

  • 从OOP开始,到处都可以看到继承
  • 但是在现实世界中,has-a比is-a发生得更频繁,而且往往更相关
  • 最后但并非最不重要的一点是,有些语言仅限于单一继承。这使得继承成为稀缺的、有价值的东西,只有在真正需要的时候才应该使用
以下示例显示了本指南的有用性和有效性:

  • 生日是一个日期
  • 但是通常有人有一个生日。约会本身永远不是生日:它只是与其他事情相关的生日。因此,作文是正确的选择
本例提供了有关is-ahas-a方法的更多见解。如果D从B继承,这意味着所有的D都是B。但这也意味着存在一些B是通过它们自己的存在(独立于其他任何东西)a D。换句话说,所有的老虎都是动物,而一些动物本身就是老虎

这些一般规则只是指导。黑色和白色之间有很多灰色阴影。例如:宠物本身就是动物吗?或者某人有宠物吗?在您的课程范围内,您可以看到关系的哪一部分最相关/对您的代码表达能力带来最大好处

关于您的特定GUI,我不能说太多。我只能给出一个语言中立(我不太懂Java)的主观性意见(基于我个人的理解和知识):

    如果编写一个通用的JFrm扩展,对于几个应用程序来说是通用的,那么你应该考虑继承。<李>
  • 但是您的GUI可能有一个用于与用户交互的JFrame,所以在原则上是组合的。例如,您可以想象,在移动设备上,您的应用程序将使用FrameLayout或其他东西,而不是JFrame。用构图更容易改变。对于某些类型的应用程序,您甚至可以想象GUI有几个JFrame,显示应用程序模型的不同视图。您甚至可以使用抽象工厂让应用程序独立于将要使用的具体对象创建GUI及其元素
  • 但最终,可能有一些战术原因,为什么您更喜欢从JFrame继承GUI。例如,如果您希望GUI的行为与JFrame完全相同。或者,如果您的应用程序是需要JFrame继承的大型项目的一部分。或者因为这是一种广泛使用的做法

总之,不要让教条为你决定。为您的具体案例做出最佳选择,并准备好用坚实的具体论据为其辩护

如果它扩展了,那就是继承,否则就是合成。“组合重于继承”只是一个建议,而不是一条规则。@Leo我知道这是一条建议,但我认识的许多人仍将其视为一条规则,甚至更糟的是,一条教条。如果我是一个误解某些东西的人(尤其是在GUI开发的情况下),或者如果我可以忽略这些人,我只需要一些输入。:)忽略这些人:-)。编程不仅仅是这样。在现实世界中,永远不会有足够的时间/人力/资源来编写最好的代码。您所能做的最好的事情就是学习如何编写防御代码。