Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 向具有不同基类的多个类添加方法 背景_Oop_Typescript - Fatal编程技术网

Oop 向具有不同基类的多个类添加方法 背景

Oop 向具有不同基类的多个类添加方法 背景,oop,typescript,Oop,Typescript,我正在创建一个GUI,其中包含由不同节点类型和连接组成的图形,以及可以从节点生成的绘图 我的眼睛看起来像这样: 如您所见,所有图形节点和绘图都是可移动的。绘图和一些图形节点可以调整大小。现在,我想让用户能够在另一种称为网络的节点类型中,将所有图形节点组合在一起 因此,我想向所有非Plot类添加一个名为restrict的方法,尽管它们有不同的基类 问题: 我听说过的一种方法是去做,但他们觉得太过分了。有没有更简单的方法向继承自不同基类的类添加方法?在这种情况下,我如何牢记“组合性优于继承性”的

我正在创建一个GUI,其中包含由不同节点类型和连接组成的图形,以及可以从节点生成的绘图

我的眼睛看起来像这样:

如您所见,所有图形节点和绘图都是可移动的。绘图和一些图形节点可以调整大小。现在,我想让用户能够在另一种称为
网络
的节点类型中,将所有图形节点组合在一起

因此,我想向所有非Plot类添加一个名为
restrict
的方法,尽管它们有不同的基类

问题: 我听说过的一种方法是去做,但他们觉得太过分了。有没有更简单的方法向继承自不同基类的类添加方法?在这种情况下,我如何牢记“组合性优于继承性”的原则

我认为我不应该仅仅将
restrict
添加到
组件
,因为这将为
绘图创建一个无用的方法,而这将永远不会被使用,这感觉像是一种糟糕的代码气味


我知道我可以使用接口进行多重继承,但接口不会自动使用引用实现,因此我必须将一组
super
调用复制到每个方法定义中。这感觉像是大量的代码重复。如果实现类没有给出实现,有没有一种方法可以从接口自动使用参考实现?

我想发表一篇评论,询问有关您情况的更多信息,这样我可以更好地准备一个答案,但我的声誉不允许这样做(一个鸡和蛋的场景阻止我构建一个更好的答案来获得更多的声誉,发表评论…)所以这里是我现在最好的答案,我可能会更新

直觉上,我认为你的问题和解决方案在很大程度上是一个概念性的问题,一旦你用这个概念解决了这个问题,这个解决方案就不需要任何花哨的编码

如果我对你正在做的事情有一个更好的“现实世界”概念,我相信我可以帮助你想出一些代码设计来实现它,但目前它是任意的“节点”等等。例如,你所说的“分组”的性质是什么

不知道别的,我有一些建议

  • 简单地让PassthroughNode从ResizebleComponent继承意味着什么?在某些情况下,这可能会导致对象占用的资源超过其需要的资源,但是如果它没有添加太多,并且提供了您想要的功能,并且是最简单的更改,那么它是一个可行的选项
  • 你根本没有提到“接口”,这让我觉得你没有意识到它们,因为这似乎正是你在这里需要的。节点和PassthroughNode都实现了一个“Groupable”接口,并且在内部都有自己的实现如何使自己“Groupable”
  • 这可能很疯狂,但组件基类可能会实现可分组行为,那么任何对象都可以分组:)

继承“ResizebleComponent”,然后过度编写使其可调整大小的所有内容确实是一种选择,但感觉不太好。接口似乎是“mixin”正在完成的全部工作,但这似乎仍然需要代码复制,因为如何将外部函数定义为两个接口的实现?我提到了为什么我不喜欢最新编辑中的最后一个场景。说实话,我从没听说过混音。接口是一个更基本的OOP概念。的确,接口仅仅定义了可用函数的存根,每个类文件中仍然需要实现。但您的目标是最小化代码重复,而不是零容忍消除它。您将首先使用组合,只有在绝对有用时才使用继承,使用接口使对象灵活,并通过使用相同接口的相同代码重用对象来减少代码重复。我从经验中了解到,如果试图避免任何和所有代码重复,您将自杀,每次遇到类似的代码时,你都要花上数小时重新设计和重新编码,只是为了炫耀你节省了10行代码不被复制。当你只复制了一次代码时,尤其是当它不是非常多的时候,在大的计划中,事情并不是那么糟糕,如果它保持开发进度,更大的好处是让你的对象由于接口而被相同的代码使用,即使它们可能会在内部复制一些代码。我得出了与你相同的结论。在这种情况下,我决定使用接口,而不是为了避免代码重复消除而发疯。感谢您帮助我浏览OOP领域。很高兴帮助其他人避免我所经历的挫折:)请记住,您可以在以后“优化”或“整理”,如果您在任何时候都不觉得有迫切的需要(例如,程序运行不慢,代码维护时间不会超过应有的时间),那就没什么关系了!过分关注最终可能无关紧要的事情是每个程序员的祸根,这是我们都必须不断努力避免的。对于您的情况,mixin可能有点过头了,但它会让您获得您提到的组合而不是继承,以及没有您提到的超级调用。Typescript现在完全支持混合。我刚刚完成了typescript混入的实现,它们在通过初始设置障碍后就开始工作了。mixin将为您提供“自动”实现所需的那种继承。