【问题标题】:The difference between abstract classes and interfaces in C# 8 release? [closed]C# 8 版本中抽象类和接口的区别? [关闭]
【发布时间】:2020-03-25 08:05:06
【问题描述】:

C# 版本 8 中添加了一个选项。到那时,抽象类和接口之间会有什么区别,为什么我还要再使用抽象类?这个版本的这个改动有什么好处?

【问题讨论】:

  • 这正是我不喜欢该功能的原因。它们是 not 实现,与“常规”实现具有相同的意义——它们是 默认 实现。它们有一个特殊用途:您可以将它们添加到一个现有接口,从而在不破坏遗留代码的情况下添加功能。它令人困惑,它鼓励肮脏的编码。我不喜欢:(
  • 我不认为这是脏代码,我们以前在抽象类的版本中就有它,所以它很有用,但我的问题是这个新功能的优势是什么?
  • 我没说它脏的。我说它鼓励脏编码。具体来说:让应该很难做的事情变得容易。我已经讨论了这个功能的好处。如果您想深入那个兔子洞并找到更多有效的应用程序:devblogs.microsoft.com/dotnet/…docs.microsoft.com/en-us/dotnet/csharp/tutorials/…docs.microsoft.com/en-us/dotnet/csharp/tutorials/…
  • 主要区别在于抽象类可以有状态,接口不能。

标签: c# .net-core-3.0 c#-8.0 .net-core-3.1


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-16
        • 2010-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多