2017-08-02 36 views
1

背景

我创建具有由不同的节点类型和连接,以及情节可以从节点可以由曲线图的GUI。添加方法到多个类具有不同的基类

inheritance tree看起来像这样:

original inheritance tree

正如你所看到的,所有的图形节点和情节是可移动的。绘图和一些图形节点可调整大小。现在,我想让用户能够将所有图形节点组合在一起,这些节点类型称为Network

network inheritance tree

所以我想添加一个名为restrict所有非剧情类方法,尽管他们有不同的基类的事实。我听说过

问题

一种方法是use mixins,但他们觉得自己大材小用。有没有更简单的方法来添加方法,从不同的基类继承的类?在这种情况下,我怎样才能将“组合性与继承性”放在一起?

我不认为我应该只加restrictComponent,因为这会创建一个永远不会被使用的无用方法,这就像一个不好的代码味道。

我知道我可以使用Interfaces进行多重继承,但Interfaces不会自动使用参考实现,因此我必须将一堆调用super复制到每个方法定义中。这感觉就像很多代码重复。如果实现类没有提供实现,是否有自动使用接口的参考实现的方法?

+0

混入可能是矫枉过正,你的情况,但它会给你在继承的组成你提到的,以及没有超级电话,你也提到。 Typescript现在完全支持mixin。我刚刚完成了实现打字稿混合,他们通过了最初的设置障碍后工作。 mixin会为您提供您使用'自动'实现所需的那种继承。 –

回答

2

我想发表评论,询问有关您的情况的更多信息,以便我可以更好地准备答案,但我的信誉数额不允许它(鸡蛋&鸡蛋的情况阻止我构建一个更好的答案有更多的声誉,发表评论...)所以这是我现在最好的答案,我可能会更新。

直觉上我认为你的问题&解决方案非常概念化,一旦你解决了这个概念的问题,解决方案将不需要任何花哨的编码。

如果我对自己在做什么有更好的“真实世界”的想法,我相信我可以帮助想出一些代码设计来实现它,但目前它是任意的“节点”等例如,你谈论的这个“分组”的性质是什么?

不知道别的,我有几点建议;

  • 简单地将PassthroughNode从ResizableComponent继承的含义是什么?在某些情况下,这可能会导致一个对象占用比它需要更多的资源,但是如果它没有增加太多,并且提供了您所追求的功能,并且是最简单的更改,那么这是一个可行的选项
  • You haven根本没有提到“接口”,这让我觉得你不知道它们,因为它看起来正是你在这里所需要的。Node和PassthroughNode都实现了“Groupable”接口,并且在内部有自己的如何使自己“可分组”的实现。
  • ,这可能是疯狂的,但分量基础类可以实现可分组行为代替,那么任何一个对象可以是可分组:)
+0

确实,从“ResizableComponent”继承并覆盖所有可调整大小的东西是一种选择,但它并不是一个好的选择。接口似乎是完整的“mixin”事情正在完成,但似乎仍需要代码复制,因为如何将外部函数定义为实现这两个接口?我提到了为什么我不喜欢最新编辑中的最后一个场景。 – Seanny123

+1

从来没有听说过mixins是诚实的。接口是一个更基本的面向对象的概念。的确,接口只是定义了可用函数的存根,并且在每个类文件中仍然需要实现。但是,您的目标是尽量减少代码重复,而不是零容忍地根除它。您将首先使用组合,只有在绝对有用的情况下继承,以及使对象更灵活的接口,并通过让相同的代码重用使用相同接口的对象来减少代码重复。 – Domarius

+1

我通过经验了解到,你会为了避免任何和所有代码重复而自杀,花费数小时的时间重新设计和重新编码,每次遇到类似的代码时,只需要吹嘘你保存的10行代码的代码被复制。当你只重复一次代码时,特别是当它不是很多时,如果它能够保持开发进度,并且由于接口让对象被相同的代码使用而获得更大的收益尽管它们可能会在内部复制一些代码。 – Domarius

相关问题