C#8-多重继承“抽象类”?

时间:2018-11-29 00:04:56

标签: c# interface abstract-class c#-8.0

在我看来,C#8.0功能是默认的接口成员实现,从本质上讲,它允许在接口级别创建实现。将其与一个类可以实现多个接口的事实相结合,似乎非常接近于类的多重继承结构。据我了解,这似乎与语言设计的核心完全相反。

这种差异从何而来,为实际的抽象类留下了什么空间?

有人建议

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

  • 我一直认为单一继承是C#设计的核心原则之一,这就是为什么实现此功能的决定令我感到惊讶的原因,我很想知道它的起源(特定于C#)。
  • 链接的问题无法回答抽象类留下了什么空间。

3 个答案:

答案 0 :(得分:4)

  

我一直认为单一继承是C#设计的核心原则之一

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

这就像说自动变速箱是汽车制造商的核心设计原则,而实际目标是使汽车更容易,更安全。纵观汽车市场,手动变速箱在低端市场(因为它们更便宜)和高端(高性能跑车)中仍然很受欢迎,在这些市场上,手动变速箱非常适合他们的用途。无论哪种类型的变速箱,在这些领域中的许多型号仍然可以使用。

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

在这种情况下,默认实现可有效地安全提供弱的多重继承,因为继承的功能不会从两个方向向下层叠继承树。您不能通过继承具有不同接口实现的两个不同类来产生冲突。您只能使用自己的类实现,默认实现或通过继承可用的单个实现。

答案 1 :(得分:2)

请注意,默认接口实现 not 不允许多重继承,至少在C ++存在问题的意义上如此。 原因多重继承是C ++中的一个问题,当一个类从多个具有相同签名方法的类中继承时,对于哪个实现可能会变得模棱两可。使用默认的接口实现,这种模糊是不可能的,因为该类本身未实现该方法。必须将对象强制转换为接口才能调用已实现的方法。因此,可以在同一实例上调用具有相同 signature 的多个方法,但是您必须明确告诉编译器您正在执行哪个方法。

答案 2 :(得分:1)

链接的post在很大程度上回答了您的第一个问题。

至:

  

链接的问题无法回答抽象所留下的空间   课程。

虽然它可以读取和听起来类似的接口默认方法实现,但肯定不会取代抽象类,也不会使其成为多余,这是非常重要的原因:

接口不能定义类级别的字段/变量,而抽象类可以具有状态

还有一些其他差异,尽管没有上述差异大,您可以在各种博客/帖子中找到这些差异