【问题标题】:What's a difference between abstract base class and new C# interfaces with default methods [duplicate]抽象基类和具有默认方法的新 C# 接口之间有什么区别[重复]
【发布时间】:2020-07-22 18:29:06
【问题描述】:

随着最近发布的 C# 8.0(提到的新功能 here),它允许提供默认方法实现。

虽然我理解这样做的原因,但我想知道这两个概念之间是否有任何区别?

想法?

【问题讨论】:

  • 我已经向我的开发同事指出了这一点。本质上,每个接口都已成为一个抽象类。因此,新功能,虽然我理解它......激怒了我的 OO 纯粹主义情感!
  • 多继承中有什么非面向对象的? C++ 有吗????
  • @LegacyCode,我哈哈大笑,并且肯定想为你的幽默点赞……没有这样做,因为这是堆栈溢出:D。不想误导他人进入评论:P
  • 对于那些追着这个问题,寻找答案的人......更多阅读材料(略切切线)是github.com/dotnet/csharplang/issues/288

标签: c# .net c#-8.0


【解决方案1】:
  1. 调用默认接口方法需要将实例转换为包含默认实现的接口
  2. 可以实现多个接口,不能继承多个抽象类

基础功能最好使用抽象类(提供更好的继承树逻辑)。并且仅当此默认逻辑适用于大多数实现时(如 Microsoft 对他们的 Collection 方法所做的那样),才使用具有默认方法实现的接口来提供小的侧面更改。

同时尽量不要过度使用默认接口实现,因为这会使从线性到树的行为继承(您也需要搜索接口,而不仅仅是类)变得复杂。

C++ 允许多重继承,如果没有控制,这方面很容易使代码无法维护。

【讨论】:

  • 如果 MI 是唯一的问题,那么它可以通过使用组合来解决。为什么更改接口?必须有更多的东西......
  • 想象一下你有一些小接口(1-2 个方法)。它由许多类实现。假设,您已经注意到大多数实现是相同的。您有两个选择:引入实现此接口并作为字段存储在目标类中的微类;使用默认接口实现。在这种没有默认接口实现的情况下,你需要编写大量的样板代码。默认接口实现只是一个方便的非常危险的(记住多继承问题)特性,如果你不过度使用它,它可以让你的生活更轻松。
【解决方案2】:

这些是我看到的主要区别:

多重继承

与其他语言(如 C++)不同,C# 不允许一个类直接从多个类继承。另一方面,一个类可以实现任意数量的接口,因此新的默认实现功能允许您执行类似于多重继承的操作。

调用默认实现

如果你从一个类派生并重写一个虚方法,你可以使用base 关键字来调用原始实现。示例:

public abstract class Base
{
    public virtual void DoSomething()
    {
        ...
    }
}
public class Derived : Base
{
    public override void DoSomething()
    {
        base.DoSomething(); //Here
        ...
    }
}

构造函数和非虚拟成员

抽象类可以声明派生类将调用的构造函数。此外,抽象类可以包含非虚拟方法,而接口只能具有可覆盖(虚拟)方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2014-10-05
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2011-04-07
    相关资源
    最近更新 更多