接口真的可以用来实现多重继承吗

Does really interfaces can be use to achieve multiple inheritance

我有这个困惑很久了。很多人说我们可以通过C#或Java等语言的接口实现多重继承,而C++不支持它。但是我对继承和接口的理解说不。因为接口是验证与行为无关的实现的契约。接口定义了某物可以做什么(而不是某物是什么)。但是继承是从 parent 继承行为 and/or 属性(就像 child 从他的 parent 获得一些遗传行为——这就是继承)。现在 child 正在学习绘画和烹饪等技能,界面(证书或合同)作为 child 拥有此类技能的验证(这就是 child 可以做他从他的 parent 那里得到的东西以外的东西 - 那不是继承)

所以我理解错了吗?如果不是那么为什么说我们可以使用接口实现多重继承?

接口给你一个类型的多重继承,但不是行为。实施 ListMap 的 class 是 "ListMap",但实施与任何现有的 ListMap 无关(必然)实施。

当然可以使用组合(无论如何都应该受到青睐),您可以轻松创建一个 ListMap 将调用相应地委托给它的 listmap 属性,同时提供一些可能是有用的功能,可以结合各自的数据。

使用 Java 允许 8 个接口的默认方法,因此现在也可以继承行为。

在 Java 中,您可以创建一个接口,例如 Animal 和一个抽象 class Bird.

然后你可以有一个 class MockingBird 它扩展了 Bird 的行为并实现了 Animal.

的行为

但是,您可以将 MockingBird 作为 AnimalBird 来寻址,因为它 "inherits" 来自两者.

不行,不能用接口实现多重继承

在Java中完全没有,在C#中,我们可以更接近。

在想实现观察者的时候研究过这个问题,结果在Robert Martin的博客:http://blog.cleancoder.com/uncle-bob/2015/01/08/InterfaceConsideredHarmful.html

读完这个 post 我意识到他在谈论 Java,但是 C# 支持允许你在接口上附加行为的扩展方法所以我试图在一些 IObservable 接口上实现我的实现,但显然失败了,即使我可以在这样的接口扩展方法中附加行为,我仍然不允许在它们上附加状态,如果有一天微软决定实现 extension properties 那么这个组合(接口 + 扩展方法 + 扩展属性)可以足以真正模拟一些有用的多重继承。

目前,我们一直在复制代码,或者像博客中所述的那样在我们所有的观察者中复制委托代码。