c# - C# 8 - 多重继承“抽象类”?
问题描述
在我看来,就像 C# 8.0 的特性,默认接口成员实现,本质上允许在接口级别创建实现。再加上一个类可以实现多个接口的事实,它似乎非常接近类的多重继承结构。据我了解,这似乎与语言设计的核心完全相反。
这种差异从何而来?这为实际的抽象类留下了多少空间?
这个问题已被建议作为我的答案,虽然它很有用,但它并不能完全回答我的问题。更准确地说:
- 我一直认为单继承是 C# 设计的核心原则之一,这就是为什么实现这个特性的决定让我感到惊讶,我很想知道它的起源(特别是 C#)。
- 链接的问题没有回答它为抽象类留下了什么空间。
解决方案
我一直认为单继承是 C# 设计的核心原则之一
这是不准确的。单继承是设计目标的一种手段,但它本身并不是一个目标。
这就像说自动变速器是汽车制造商的核心设计原则,而实际目标是让汽车更容易、更安全。纵观汽车市场,手动变速器仍然在市场的低端(因为它们更便宜)和高端(高性能跑车)中蓬勃发展,它们非常适合用途。这些领域的许多型号仍然可以使用任何一种传输方式。
C# 中导致单一继承的实际设计目标更多是关于内存访问和重载解决方案的安全性和正确性。与单继承相比,多继承很难在数学上验证这些东西。但是当他们找到优雅的解决方案时,C# 设计人员添加了许多扩展单继承界限的功能。除了接口之外,我们还有部分类、泛型(以及后来的协变/逆变)和委托成员,它们都朝着这个方向发展。
在这种情况下,默认实现在安全地提供弱多重继承方面是有效的,因为继承的功能不会从两个方向向下级联继承树。你不能通过继承两个具有不同接口实现的不同类来制造冲突;您仅限于自己的类实现、默认实现或通过继承可用的单个实现。
推荐阅读
- reactjs - React:条件渲染的问题
- sql-server - SQL Server 2008
- outlook - 是否可以使用 SOAP 请求通过 EWS 创建公用文件夹邮箱?
- android - 扑向本机活动的路线
- office-js - 我们的清单提到了 ItemType 消息,但也为约会调用了 ItemSend 事件
- javascript - 用于查找 h2 和 h3 标记的 JavaScript RegEx 表达式
- c++ - Makefile“重新链接”是什么意思?
- spring-integration - 如何通过 DSL 组合 Spring Integration 流
- python - 将 js 变量传递给 Ckan 中的 Jinja 模板
- pyspark - pyspark - Spark hbase 连接器抛出无法找到数据源