问题标签 [multiple-inheritance]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
590 浏览

python - 如何实现具有非本地平等的装饰器?

问候,目前我正在重构我的一个程序,我发现了一个有趣的问题。

我在自动机中有过渡。转换总是有一个开始状态和一个结束状态。一些转换有一个标签,它对遍历时必须执行的某个动作进行编码。没有标签就意味着没有行动。一些转换有一个条件,必须满足才能遍历这个条件,如果没有条件,则转换基本上是 NFA 中的 epsilon-transition 并且将在不消耗输入符号的情况下进行遍历。

我需要以下操作:

  • 检查转换是否有标签
  • 得到这个标签
  • 为过渡添加标签
  • 检查转换是否有条件
  • 得到这个条件
  • 检查平等

从前五点来看,这听起来像是一个清晰的装饰器,有一个基本的过渡和两个装饰器:Labeled 和 Condition。但是,这种方法有一个问题:如果两个转换的开始状态和结束状态相同,则两个转换被认为是相等的,两个转换处的标签相等(或不存在)并且两个条件相同(或不存在) . 使用装饰器,我可能有两个转换 Labeled("foo", Conditional("bar", Transition("baz", "qux"))) 和 Conditional("bar", Labeled("foo", Transition("baz) ", "qux"))) 需要非局部相等,也就是说,装饰器需要收集所有数据,并且转换必须在集合基础上比较这些收集的数据:

这是一种干净的方法吗?我错过了什么吗?

我很困惑,因为我可以使用协作多重继承来解决这个问题——使用更长的类名:

LabledConditionalTransition 类的行为与预期完全一样——并且没有代码很吸引人,我不认为 MI 在这种大小下会令人困惑。

当然,第三种选择是将所有东西都锤入一个带有一堆 in has_label/has_transition 的转换类中。

所以......我很困惑。我错过了什么吗?哪个实现看起来更好?你如何处理类似的情况,即看起来像装饰器的对象可以处理它们,但是,这样的非本地方法出现了?

编辑:添加了 ConditionalTransition 类。基本上,这有点像装饰器,减去创建装饰器的顺序,过渡检查开始和结束是否正确,LabeledTransition 类检查标签是否正确,ConditionalTransition 检查条件是否正确。

0 投票
8 回答
43172 浏览

c++ - 使用多重继承时如何避免死亡钻石?

http://en.wikipedia.org/wiki/Diamond_problem

我知道这意味着什么,但我可以采取哪些措施来避免它?

0 投票
14 回答
439142 浏览

c# - C#中的多重继承

由于多重继承不好(它使源代码更复杂)C# 没有直接提供这样的模式。但有时拥有这种能力会有所帮助。

例如,我可以使用接口和三个类似的类来实现缺少的多重继承模式:

每次我向其中一个接口添加方法时,我也需要更改FirstAndSecond类。

有没有办法像在 C++ 中那样将多个现有类注入一个新类?

也许有使用某种代码生成的解决方案?

或者它可能看起来像这样(虚构的 c# 语法):

这样当我修改其中一个接口时就不需要更新类 FirstAndSecond 了。


编辑

也许考虑一个实际的例子会更好:

您已经在项目内的不同位置使用了一个现有的类(例如,基于 ITextTcpClient 的基于文本的 TCP 客户端)。现在您觉得有必要为您的类创建一个组件,以便 Windows 窗体开发人员可以轻松访问。

据我所知,您目前有两种方法可以做到这一点:

  1. 编写一个从组件继承的新类,并使用类本身的实例实现 TextTcpClient 类的接口,如 FirstAndSecond 所示。

  2. 编写一个继承自 TextTcpClient 并以某种方式实现 IComponent 的新类(实际上还没有尝试过)。

在这两种情况下,您都需要按方法而不是按类工作。既然您知道我们将需要 TextTcpClient 和 Component 的所有方法,那么将这两者组合到一个类中将是最简单的解决方案。

为避免冲突,这可以通过代码生成来完成,其中结果可以在之后更改,但是手动输入是纯粹的痛苦。

0 投票
34 回答
10761 浏览

c# - C# 应该有多重继承吗?

我遇到了许多反对在 C# 中包含多重继承的论点,其中一些包括(撇开哲学论点):

  • 多重继承太复杂而且经常模棱两可
  • 这是不必要的,因为接口提供了类似的东西
  • 在接口不合适的情况下,组合是一个很好的替代品

我来自 C++ 背景,怀念多重继承的力量和优雅。尽管它并不适合所有软件设计,但在某些情况下,很难否认它对接口、组合和类似的 OO 技术的实用性。

排除多重继承是否意味着开发人员不够聪明,无法明智地使用它们,并且无法在出现复杂性时解决它们?

我个人会欢迎在 C#(可能是 C##)中引入多重继承。


附录:我很想知道来自单一(或程序背景)与多重继承背景的回复。我经常发现没有多重继承经验的开发人员通常会默认使用多重继承是不必要的论点,因为他们没有任何范式经验。

0 投票
11 回答
259100 浏览

python - “超级”在 Python 中做了什么?- super().__init__() 和显式超类 __init__() 之间的区别

有什么区别:

和:

我已经看到super在只有单一继承的类中被大量使用。我可以理解您为什么要在多重继承中使用它,但不清楚在这种情况下使用它有什么优势。

0 投票
11 回答
82866 浏览

oop - 多重继承的确切问题是什么?

我可以看到人们一直在问是否应该在下一个版本的 C# 或 Java 中包含多重继承。有幸拥有这种能力的 C++ 人说,这就像给某人一根绳子,最终让自己上吊。

多重继承是怎么回事?有具体的样品吗?

0 投票
10 回答
1254 浏览

c++ - 在 C++ 中寻找比虚拟继承更好的方法

好的,我在 C++ 中有一个有点复杂的系统。简而言之,我需要向第三方抽象基类添加一个方法。第三方还提供了大量也需要新功能的派生类。

我正在使用一个提供标准 Shape 接口以及一些常见形状的库。

现在,这是我的问题。我希望 Shape 类也包含一个 GetArea() 函数。所以看起来我应该做一个:

然后我去做一个继承自ImprovedShape 和Square 的ImprovedSquare。好吧,正如你所看到的,我现在已经创建了可怕的钻石继承问题。如果第三方库对其 Square、Circle 等使用虚拟继承,这将很容易解决。但是,让他们这样做并不是一个合理的选择。

那么,当您需要向库中定义的接口添加一点功能时,您会怎么做?有好的答案吗?

谢谢!

0 投票
5 回答
58997 浏览

c++ - 来自两个派生类的多重继承

我有一个充当接口的抽象基类。

我有两个“集”派生类,它们实现了抽象类的一半。(一个“set”定义了与初始化相关的抽象虚拟方法,另一个“set”定义了与实际“工作”相关的那些。)

然后我有派生类,它们使用多重继承来构造完全定义的类(并且本身不添加任何东西)。

所以:(错误的伪代码)

首先,我可以这样做吗?我可以从两个派生自同一个 Base 的类继承吗?(但愿如此)。

不过,这是“真正的问题”(我在上面撒了一点谎以简化示例)。

我真正所做的是向基类添加非抽象访问器方法:

因为,一个常见的习惯是将所有虚拟方法设为私有。

不幸的是,现在 AbsInit 和 AbsWork 都继承了这些方法,因此 NotAbsTotal 继承了“每个中的两个”(我意识到我可能正在扼杀编译时真正发生的事情)。

无论如何,g++ 在尝试使用该类时抱怨说:“对成员 init() 的请求不明确”。

我假设,如果我将 AbsBase 类用作纯接口,这将是可以避免的(假设上面的例子是有效的)。

所以: - 我的实施是否可行?- 这是将虚拟方法设为私有的习语的限制吗?- 我如何重构我的代码来做我想做的事?(提供一个通用接口,但允许使用一种方法来交换成员函数“集合”的实现)

编辑:

似乎我不是第一个: http ://en.wikipedia.org/wiki/Diamond_problem

似乎虚拟继承是这里的解决方案。我以前听说过虚拟继承,但我还没有深入了解它。我仍然愿意接受建议。

0 投票
5 回答
2698 浏览

c++ - C++ 多重虚拟继承与 COM

网上充斥着对“可怕的钻石问题”的解释。StackOverflow 也是如此。我想我理解这一点,但我未能将这些知识转化为理解相似但不同的东西。

我的问题从纯 C++ 问题开始,但答案很可能会扩展到 MS-COM 细节。一般问题的问题是:

不是经典的钻石解决方案。究竟“虚拟”在这里做什么?

我真正的问题是试图理解我们朋友在 CodeProject 的讨论。它涉及用于为 Flash 播放器创建透明容器的自定义类。

我想我会试试这个地方的乐趣。事实证明,以下声明使用 Flash 播放器版本 10 使您的应用程序崩溃。

调试表明,当输入来自不同调用者的函数实现(QueryInterface 等)时,我得到不同调用的不同“this”指针值。但是删除“虚拟”就可以了!没有崩溃,并且相同的“this”指针。

我想清楚地了解到底发生了什么。非常感谢。

干杯亚当

0 投票
6 回答
4401 浏览

python - 为什么我不能从 Python 中的 dict AND Exception 继承?

我得到了以下课程:

有没有搞错 ?

最糟糕的是我不能尝试 super() 因为 Exception 是基于旧的类......

编辑:而且,是的,我试图切换继承/初始化的顺序。

EDIT2:我在 Ubuntu8.10 上使用 CPython 2.4。你更新知道这种信息很有用;-)。不管怎样,这个小谜语已经让我三个同事闭嘴了。你会是我今天最好的朋友...