C# 8版本中抽象类和接口的区别是什么?

5

在C#的第8个版本中,新增了一个选项。那么,抽象类和接口之间的区别是什么,为什么我还要使用抽象类呢?这个版本中这种变化的优势是什么?


2
这正是我为什么不喜欢那个功能的原因。它们在“常规”实现意义上并没有被实现 — 它们是默认实现。它们有一个特殊的用途:您可以将它们添加到现有接口中,从而添加功能而不破坏旧代码。这很容易让人感到困惑,也会鼓励肮脏编码。我不太喜欢:( - Fildor
我不认为这是肮脏的代码,我们在抽象类中之前就有过它,所以它很有用。但我的问题是,这个新功能有什么优势? - sajadre
我并没有说它是肮脏的。我说它鼓励了肮脏的编码。具体来说:通过使本应该困难的事情变得容易。我已经讨论了这个功能的好处。如果你想深入了解更多有效的应用程序,请参考以下链接:https://devblogs.microsoft.com/dotnet/default-implementations-in-interfaces/,https://learn.microsoft.com/en-us/dotnet/csharp/tutorials/default-interface-methods-versions,https://learn.microsoft.com/en-us/dotnet/csharp/tutorials/mixins-with-default-interface-methods - Fildor
主要的区别在于抽象类可以拥有状态,而接口则不能。 - Magnus
默认接口方法 - 现在抽象类和接口之间有什么深刻而有意义的区别? - Peter Duniho
3个回答

4

接口的基本特征仍然是它们不能包含字段。如果您需要数据,您需要一个基类。如果不需要数据,那么使用接口可能就足够了。


4

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

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

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

这个更改有一些原因:扩展API、与Android、iOS的互操作性以及支持特征语言功能。


3

一个类可以实现多个接口,但只能继承一个抽象类。 接口不能有构造函数和析构函数,但抽象类可以。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接