C# 8 版本中抽象 类 和接口之间的区别?

The difference between abstract classes and interfaces in C# 8 release?

C# 版本 8 中添加了一个选项。到那时,abstract classes 和接口之间的区别是什么?为什么我还要再使用 abstract class?此版本中的此更改有什么优势?

一个class可以扩展多个接口但只能扩展一个抽象class。 接口不能有构造函数和析构函数,但抽象 class 可以。

接口的根本特征还是不能包含字段。如果你需要数据,你需要一个基础class。如果不是,一个接口可能就足够了。

C# 8.0 引入了一个称为接口中的默认实现的新功能,这改变了许多事情。

接口现在可以有方法的默认实现。 接口现在可以有私有成员。 接口现在可以有静态成员,这用于默认实现的参数化。 接口现在可以具有派生 class 无法访问但可以通过派生接口访问的受保护成员。 如果 class 想要实现受保护的成员,则必须通过显式实现接口来完成。 接口也可以有虚拟成员,但是 class 不能覆盖方法但是接口可以。

我们现在可以认为接口和抽象有些相同,但是接口不能有实例状态、实例字段、实例自动属性,不能定义class级字段或变量,而抽象class 可以有状态。

进行此更改的原因如下:扩展 API、与 Android 的互操作性、iOS 以及支持特征语言功能。