C# 8 - 多重继承 "abstract class"?

C# 8 - multiple inheritance "abstract class"?

在我看来,C# 8.0 的功能,默认接口成员实现,本质上允许在接口级别创建实现。结合 class 可以实现多个接口的事实,它似乎非常接近 classes 的多重继承结构。据我了解,这似乎与该语言的设计核心背道而驰。

这种差异从何而来?这为实际摘要 class 留出了多少空间?

已被建议作为我的答案,虽然它很有用,但并不能完全回答我的问题。更准确地说:

链接的 很好地回答了您的第一个问题。

至于:

The linked question does not answer what room it leaves for abstract classes.

虽然它可能读起来和听起来很相似,但接口默认方法实现当然不会取代抽象 classes 也不会使它们变得多余,最重要的原因是:

接口不能定义 class 级别 fields/variables 而抽象 class 可以有状态 .

还有一些其他的区别,虽然没有前面提到的那么大,你可以在各种blogs/posts:

中找到

等等

I always assumed that single inheritance is one of the core principles of C#'s design

这是不准确的。单一继承是设计目标的手段,但本身并不是目标。

这就像说自动变速器是汽车制造商的核心设计原则,而实际目标是让汽车更轻松、更安全。纵观汽车市场,手动变速箱在低端(因为它们更便宜)和高端(高性能跑车)市场仍然蓬勃发展,它们非常适合用途。这些地区的许多车型仍然可以使用任何一种传输方式。

导致单继承的 C# 中的实际设计目标更多是关于内存访问和重载解析的安全性和正确性。与单继承相比,多继承很难从数学上验证这些东西。但是,当他们找到优雅的解决方案时,C# 设计人员添加了许多扩展单一继承范围的功能。除了接口之外,我们还有部分 classes、泛型(以及后来的 co/contravariance)和委托成员,它们都朝着这个方向发展。

在这种情况下,默认实现在安全地 中有效,提供弱多重继承,因为继承的功能不会从两个方向沿继承树向下级联。您不能通过继承两个具有不同接口实现的不同 classes 来制造冲突;您仅限于自己的 class 实现、默认实现或通过继承可用的单一实现。

请注意,默认接口实现 允许多重继承,至少不是 C++ 的问题。 原因 多重继承是 C++ 中的一个问题,当一个 class 继承自多个具有相同签名方法的 class 时,它会变得模棱两可需要哪个实现。使用默认接口实现,这种歧义是不可能的,因为 class 本身没有实现方法 。必须将对象强制转换为接口才能调用已实现的方法。所以多个具有相同签名的方法可能会在同一个实例上被调用,但是你必须明确地告诉编译器你正在执行哪个方法