我们可以在 C# 中用带有默认方法的接口替换抽象 class

Can we replace abstract class with Interface with Default Methods in C#

在 C# 8.0 中,我们有一个新功能,我们可以在接口中提供默认方法实现,也可以通过实现 类 来覆盖它。

我们曾经使用带有实例方法的抽象 类 来为其所有实现提供通用功能 类。

现在我可以将那些具有实例方法的抽象 类 替换为具有来自 C# 8.0 的默认方法实现的接口吗?

不,抽象类仍然有它们的位置。特别是,抽象 类 可以声明 fields(如今通常通过自动实现的属性),而接口仍然不能。他们还可以定义构造函数,并在其中执行验证。

以下是您无法使用界面执行的操作示例:

public abstract class NamedObject
{
    public string Name { get; }

    protected NamedObject(string name) =>
        Name = name ?? throw new ArgumentNullException(nameof(name));

    // Abstract methods here
}

显然它不会 真的 被称为 NamedObject - 有一个业务特定的原因让它是抽象的,这将决定名称。但是这里的行为是不能放在接口中的行为。

在大多数情况下可以,但可能不应该。接口中的默认功能是为了解决另一个问题。

当您无法更改现有的 class 时,它就在那里,如果例如在其他 project/ibrary 中并且您想扩展功能而不用抽象 project/ibrary 更改所有代码=17=]..

也许作为摘要 class 确实有意义?具有行为但本身没有意义且必须扩展的对象应该由 class 更好地建模。如果您的 Car class 具有行为,那么您可以拥有适用于所有汽车的 length private 成员。私有成员不是接口的一部分。