3

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

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

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

4

2 回答 2

4

不,抽象类仍然占有一席之地。特别是,抽象类可以声明字段(现在通常通过自动实现的属性),而接口仍然不能。他们还可以定义构造函数,并在其中执行验证。

这是一个你不能用接口做的事情的例子:

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

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

    // Abstract methods here
}

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

于 2019-12-12T07:08:28.423 回答
0

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

当您无法更改现有类时,它就在那里,例如,如果在其他一些项目/库中,并且您想要扩展功能而不用抽象类更改所有代码..

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

于 2019-12-12T07:13:29.310 回答