我们可以在 C# 中用默认方法的接口替换抽象类吗?



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

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

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

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

下面是一个无法使用接口执行的操作示例:

public abstract class NamedObject
{
public string Name { get; }
protected NamedObject(string name) =>
Name = name ?? throw new ArgumentNullException(nameof(name));
// Abstract methods here
}

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

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

当您无法更改现有类时,例如在其他项目/ibrary 中,并且您希望扩展功能而不使用抽象类更改所有代码时,它就在那里。

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

相关内容

  • 没有找到相关文章

最新更新