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

C# C8版本中抽象类和接口之间的区别?,c#,.net-core-3.0,c#-8.0,.net-core-3.1,C#,.net Core 3.0,C# 8.0,.net Core 3.1,在C的版本8中添加了一个选项。在这一点上,抽象类和接口之间的区别是什么?为什么我会再使用抽象类?此版本中此更改的优点是什么?一个类可以扩展多个接口,但只能扩展一个抽象类。 一个接口不能有构造函数和析构函数,但可以有一个抽象类。一个类可以扩展多个接口,但只能扩展一个抽象类。 接口不能有构造函数和析构函数,但可以有抽象类。接口的基本特征仍然是它们不能包含字段。如果需要数据,则需要一个基类。如果没有,接口可能就足够了。接口的基本特征仍然是它们不能包含字段。如果需要数据,则需要一个基类。如果没有,接口可

在C的版本8中添加了一个选项。在这一点上,抽象类和接口之间的区别是什么?为什么我会再使用抽象类?此版本中此更改的优点是什么?

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

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

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

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

C8.0在接口中引入了一种称为默认实现的新功能,这改变了许多事情

接口现在可以有方法的默认实现。 接口现在可以有私有成员。 接口现在可以有静态成员,这用于默认实现的参数化。 接口现在可以具有受保护的成员,这些成员不能被派生类访问,但可以通过派生接口访问。 如果类要实现受保护的成员,则必须显式实现接口。 接口也可以有虚拟成员,但类不能重写方法,但接口可以

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


这一变化有一些原因:扩展API、与Android、iOS的互操作性以及支持traits语言功能。

C 8.0在接口中引入了一种称为默认实现的新功能,这改变了很多事情

接口现在可以有方法的默认实现。 接口现在可以有私有成员。 接口现在可以有静态成员,这用于默认实现的参数化。 接口现在可以具有受保护的成员,这些成员不能被派生类访问,但可以通过派生接口访问。 如果类要实现受保护的成员,则必须显式实现接口。 接口也可以有虚拟成员,但类不能重写方法,但接口可以

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


这一变化有一些原因:扩展API、与Android、iOS的互操作性以及支持traits语言功能。

这正是我不喜欢该功能的原因。它们不是与常规实现相同意义上的实现——它们是默认实现。它们有一个特殊的用途:您可以将它们添加到现有接口中,从而在不破坏遗留代码的情况下添加功能。这是令人困惑的,它鼓励肮脏的编码。我不喜欢:我不认为这是脏代码,我们以前在抽象类的早期版本中有过它,所以它很有用,但我的问题是这个新功能的优点是什么?我没有说它脏。我说它鼓励肮脏的编码。具体来说:通过简化应该很难做的事情。我已经讨论了该功能的优点。如果你想深入这个兔子洞,找到更有效的应用程序:,主要的区别是抽象类可以有状态,接口不能。这正是我不喜欢这个特性的原因。它们不是与常规实现相同意义上的实现——它们是默认实现。它们有一个特殊的用途:您可以将它们添加到现有接口中,从而在不破坏遗留代码的情况下添加功能。这是令人困惑的,它鼓励肮脏的编码。我不喜欢:我不认为这是脏代码,我们以前在抽象类的早期版本中有过它,所以它很有用,但我的问题是这个新功能的优点是什么?我没有说它脏。我说它鼓励肮脏的编码。具体来说:通过简化应该很难做的事情。我已经讨论了该功能的优点。如果您想深入这个兔子洞并找到更有效的应用程序:,主要区别在于抽象类可以有state和interfaces