问题标签 [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 投票
5 回答
28560 浏览

python - Python 的“超级”如何做正确的事?

我正在运行 Python 2.5,所以这个问题可能不适用于 Python 3。当您使用多重继承创建菱形类层次结构并创建派生类的对象时,Python 会做正确的事情 (TM)。它调用派生类的构造函数,然后是从左到右列出的父类,然后是祖父类。我熟悉 Python 的MRO;那不是我的问题。我很好奇从 super 返回的对象实际上如何以正确的顺序与父类中的 super 调用进行通信。考虑这个示例代码:

代码做直观的事情,它打印:

但是,如果您在 B 的 init 函数中注释掉对 super 的调用,则不会调用 A 和 C 的 init 函数。这意味着 B 对 super 的调用以某种方式知道 C 在整个类层次结构中的存在。我知道 super 返回一个带有重载 get 运算符的代理对象,但是 D 的 init 定义中 super 返回的对象如何将 C 的存在传达给 B 的 init 定义中 super 返回的对象?后续调用 super 使用的信息是否存储在对象本身上?如果是这样,为什么不是 super 而不是 self.super?

编辑:Jekke 非常正确地指出它不是 self.super 因为 super 是类的属性,而不是类的实例。从概念上讲这是有道理的,但实际上 super 也不是类的属性!您可以在解释器中通过创建两个类 A 和 B(其中 B 继承自 A)并调用dir(B). 它没有super__super__属性。

0 投票
6 回答
30367 浏览

c++ - 多重继承+虚函数混乱

我有一个像这样的菱形多重继承场景:

公共父节点 A 定义了一个虚函数 fn()。
B和C都可以定义fn()吗?
如果是,那么下一个问题是 - D 可以无歧义地访问 B 和 C 的 fn() 吗?我假设这有一些语法..
D 是否有可能在不知道具体谁是 B 和 C 的情况下这样做?B 和 C 可以被其他一些类替换,我希望 D 中的代码是通用的。

我想要做的是让 D 以某种方式枚举它在其祖先中拥有的所有 fn() 实例。这是否可能以其他方式表示虚拟功能?

0 投票
1 回答
101 浏览

vb.net - 派生 System.Data 类

我想利用继承 System.Data 命名空间的类。

具体来说,我希望分别从 DataColumn、DataTable 和 Dataset 派生类 CarColumn、CarTable 和 CarSet。

我希望能够为每个类添加额外的属性。例如,这就是我想在类中引用项目的方式:

CarSet.CarTable(0).Columns(0).foo

CarSet.CarTable(0).bar

我知道 VB.Net 不能进行多重继承。实现这一目标的最佳方法是什么?

谢谢,保罗

0 投票
3 回答
3000 浏览

python - 讨论项目的多重继承与组合(+其他事物)

我正在编写一个用于模拟分布式传感器群的 python 平台。这个想法是最终用户可以编写一个由 SensorNode 行为(通信、日志记录等)组成的自定义节点,并实现许多不同的传感器。

下面的例子简要地演示了这个概念。

新编辑:

首先概述我想要实现的目标:我正在编写一个模拟器来模拟群体智能算法,特别关注移动传感器网络。这些网络由许多小型机器人组成,它们相互交流各个传感器数据,以构建复杂的环境感官地图。

该项目的基本目标是开发一个模拟平台,为传感器提供抽象接口,以便可以将相同的用户实现功能直接移植到运行嵌入式 linux 的机器人群中。由于机器人实现是目标,因此我需要设计成软件节点的行为相同,并且只能访问物理节点所拥有的信息。

作为模拟引擎的一部分,我将提供一组模拟不同类型传感器和不同类型传感器节点的类。我希望从用户那里抽象出所有这些复杂性,以便用户所要做的就是定义节点上存在哪些传感器,以及正在实施哪种类型的传感器节点(移动、固定位置)。

我最初的想法是每个传感器都会提供一个 read() 方法,该方法将返回相关值,但是在阅读了对问题的回答后,我发现可能更具描述性的方法名称会是有益的(.distance(), .position( )、.bearing() 等)。

我最初想为传感器使用单独的类(具有共同的祖先),以便技术更高的用户可以轻松地扩展现有类之一以创建新的传感器,如果他们愿意的话。例如:

我最初考虑多重继承的原因(尽管它半破坏了继承的 IS-A 关系)是由于模拟系统背后的基本原理。让我解释:

用户实现的 MySensorNode 不应直接访问其在环境中的位置(类似于机器人,通过传感器接口间接访问),同样,传感器不应知道它们在哪里。然而,这种缺乏直接知识带来了一个问题,因为传感器的返回值都取决于它们在环境中的位置和方向(需要对其进行模拟才能返回正确的值)。

SensorNode,作为模拟库中实现的一个类,负责在 pygame 环境中绘制 MySensorNode - 因此,它是唯一应该直接访问环境中传感器节点的位置和方向的类。

SensorNode 还负责环境中的平移和旋转,但是这种平移和旋转是电机驱动的副作用。

我的意思是机器人不能直接改变它们在世界中的位置,它们所能做的就是为电机提供动力,而在世界中的运动是电机与环境相互作用的副作用。我需要在模拟中准确地建模。

因此,要移动,用户实现的功能可以使用:

作为副作用,此调用将改变节点在世界中的位置。

如果 SensorNode 是使用组合实现的,SensorNode.motors(...) 将无法直接更改实例变量(例如位置),MySensorNode.draw() 也不会解析为 SensorNode.draw(),因此 SensorNode imo 应该使用继承来实现。

在传感器方面,像这样的问题组合的好处是显而易见的,MySensorNode 是由许多传感器组成的——说得够多了。

然而,我看到的问题是传感器需要访问它们在世界中的位置和方向,如果你使用组合,你最终会得到如下调用:

再说一遍 - 想一想,你可以在初始化时将 self 传递给传感器,例如:

然后稍后

但是这个 PosSensor.position() 需要访问实例的本地信息(在init () 期间作为 self 传递),那么当您可以在本地访问信息时为什么还要调用 PosSensor 呢?同样将您的实例传递给您所组成的对象似乎不太正确,跨越了封装和信息隐藏的界限(即使python在支持信息隐藏的想法方面做得不多)。

如果解决方案是使用多重继承来实现的,这些问题就会消失:


希望这次编辑澄清了一些事情,如果您有任何问题,我很乐意尝试澄清它们

旧事:

构造 MySensorNode 类型的对象时,需要调用超类中的所有构造函数。我不想让用户不得不为 MySensorNode 编写一个自定义构造函数,该构造函数从每个超类调用构造函数。理想情况下,我希望发生的是:

任何见解或一般性评论将不胜感激,干杯:)

旧编辑:做类似的事情:

这很有效,因为 self 是 MySensorNode 的一个实例。然而,这个解决方案很混乱。


0 投票
6 回答
496 浏览

c# - 分配给不同子类类型的通用属性和方法

我正在构建自己的基本用户界面类。在它们上,我希望它们都具有相似的“通用”属性和方法。我可以定义一个接口类,但接口似乎只允许抽象方法,没有属性。

我不想将完全相同的代码复制到每个类,但不知道如何实现... 例如:我希望这些常见的东西适用于按钮、文本框、复选框、列表框等用户控件。

建议???

0 投票
6 回答
9675 浏览

multiple-inheritance - 多重继承的优缺点是什么?

多重继承的优缺点是什么?

为什么我们在 C# 中没有多重继承?

更新 好的,因此目前避免了因为冲突解决正在调用哪个父方法等问题。当然这是程序员要解决的问题。或者,这可以像 SQL 一样解决,其中存在冲突需要更多信息,即 ID 可能需要变为 Sales.ID 才能解决查询中的冲突。

0 投票
5 回答
2724 浏览

c# - 如何在 C# 中实现类之间的共享行为(当然没有多重继承)

更新:几乎这里的每个人都告诉我,我只需要重新开始我如何设计我的课程(顺便感谢你们的出色回答!)。得到提示后,我开始广泛阅读策略模式。我想创建从一个或多个抽象基类继承的行为类(或策略类)。然后,候选类将具有带有不同抽象基类/类的属性作为Type行为或策略。也许是这样的:

有什么意见或建议吗?


原始问题:

我正在努力学习并更加精通设计模式和原则。我目前正在为一些让我难过的课程进行设计。这是代码的非常精简的版本:

InternalEntryLevelCandidate 类主要是一个EntryLevelCandidate,但需要共享InternalCandidate 的一些实现。我说实现是因为我不希望实现不同或重复,否则我会使用通用合同的接口并在每个类中都有具体的实现。InternalCandidate 属性和行为的一些实现需要通用或共享。我已经阅读了 C++ 和 Ruby mixins,这似乎与我想做的类似。我还阅读了这篇有趣的博客文章,其中讨论了一种行为类型的想法,其中一个类能够继承多个行为,同时仍然保持单一的“是”关系:http://www.deftflux.net/blog/post/A-good-design-for-multiple-implementation-inheritance.aspx。这似乎传达了我想要的东西。谁能给我一些指导,告诉我如何使用良好的设计实践来实现这一目标?

0 投票
0 回答
454 浏览

c# - LinFu - can't quite see how to do what I want

Just found LinFu - looks very impressive, but I can't quite see how to do what I want to do - which is multiple inheritance by mixin (composition/delegation as I'd say in my VB5/6 days - when I had a tool to generate the tedious repetitive delegation code - it was whilst looking for a C# equivalent that I found LinFu).

FURTHER EDIT: TO clarify what I mean by composition/delegation and mixin.

Imagine objects with many more properties, used in many more "subclasses" and you start to see the tedium. A code-gernation tool would actually be just fine...

So, LinFu.... The mixin example below is fine but I'd want to have an actual Person class (as above) - what's the LinFu-esque way of doing that? Or have I missed the whole point?

EDIT: I need to be able to do this with classes that are already subclassed.

0 投票
5 回答
1658 浏览

python - 如何在我的课堂上赋予字符串性?

我想要一个带有一个附加属性的字符串,让我们说是用红色还是绿色打印它。

Subclassing(str) 不起作用,因为它是不可变的。我看到了它的价值,但它可能很烦人。

多重继承有帮助吗?我从来没有用过那个。

仅继承对象并使用 self.value=str 意味着我必须自己实现所有字符串消息(如 strip)。

或者有没有办法转发它们,比如Ruby的missing_method?

我认为使用按实例索引的类级字典来存储颜色是可行的。太丑了?

0 投票
2 回答
15644 浏览

python - python中的抽象类+mixin+多重继承

所以,我认为代码可能比我用语言更好地解释了我想要做的事情,所以这里是:

结果:

我试图让 mixin 类满足抽象/接口类的要求。我错过了什么?