使用GUI进行继承的组合

时间:2014-12-18 11:42:29

标签: inheritance coding-style composition

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

正如清洁法典告诉我们的那样,构成是赞成继承 现在有很多关于这个主题的博客文章,其中一些针对GUI开发 到目前为止,我读过的最“重要”(对于那些家伙)的句子是“你不是从JFrame / JDialog派生的”。

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

对我而言,案件很清楚:
我的应用程序使用组合来创建GUI的实例,但GUI本身使用继承,因为 JFrame,然后此GUI再次使用组合作为其中的控件。
我永远不会想到使用GUI的compisition,因为我的GUI有一个GuiManager,它具有JFrame GUI的所有控件然后构建(如:将它放在一起)并显示它。毕竟,控件是GUI的一部分,因此应该是它的成员变量?! (仅当GUI使用继承时才可以) 并且要更清楚:是的,我的GUI应该像JFrame一样,如果需要的话,应该像其他开发人员一样使用JFrame。

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

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

1 个答案:

答案 0 :(得分:1)

编程既是一门艺术,也是一门科学。在这方面,没有必要通过一种最佳方式来实现结果,并且由您来比较利弊。

" 组成是赞成过继承"是一个指导:

  • 从OOP开始,到处都可以看到继承。
  • 但在现实世界中, has-a 的发生频率高于 is-a ,并且通常更具相关性。
  • 最后但并非最不重要的是,某些语言仅限于单一继承。这使得遗产变得稀缺,有价值,只有在真正需要时才能使用。

以下示例显示了此指南的有用性和有效性:

  • 生日 日期
  • 但通常某人 生日 date 本身永远不是生日:它只是与其他事物相关的生日。因此,作文是正确的选择。

此示例提供了对 is-a has-a 方法的其他见解。如果D继承自B,这意味着所有D都是B.但这也意味着存在一些B是由他们自己存在的(独立于其他任何东西)而是D.换句话说,所有老虎 动物,而一些动物本身就是老虎

这些一般规则仅供参考。黑色和白色之间有很多灰色阴影。例如: 宠物 动物本身?或某人 拥有 宠物?在您的计划范围内,您可以看到这种关系的哪一部分最相关/为您的代码表达带来最大的好处。

我无法对您的特定GUI说出多少模式。我只能给一种语言中立(我不能很好地掌握Java)主观意见(基于我的个人解释和知识):

  • 如果您编写了一种JFrame的通用扩展,它通常用于多个应用程序,那么您应该考虑继承。
  • 但您的GUI可能有一个用于与用户交互的JFrame,因此在原始组合中。例如,您可以想象在移动设备上,您的应用程序将使用FrameLayout或其他内容而不是JFrame。随着构图的变化更容易。对于某种应用程序,您甚至可以想象GUI具有多个JFrame,显示应用程序模型的不同视图。您甚至可以使用抽象工厂让应用程序创建GUI及其元素,而不依赖于将要使用的具体对象。
  • 但最后,可能有一些战术原因,为什么你更喜欢你的GUI继承JFrame。例如,如果您希望GUI的行为与JFrame完全相同。或者,如果您的应用程序是需要JFrame继承的较大项目的一部分。或者因为它是一种广泛使用的做法。

总而言之,不要让教条为你决定。为您的具体案例做出最佳选择,并准备好用坚实的具体论据来捍卫它!