在C# 8.0中,我们有一个新特性,可以在接口中提供默认方法实现,它也可以被它的实现类覆盖。
过去,我们有带有实例方法的抽象类,为它的所有实现类提供公共功能。
现在,我是否可以将那些具有实例方法的抽象类替换为那些在wards上拥有默认C# 8.0实现的接口?
发布于 2019-12-12 07:08:28
不,抽象课仍然有自己的位置。特别是,抽象类可以声明字段(现在通常通过自动实现的属性),接口仍然不能声明字段,它们还可以定义构造函数,并在其中执行验证。
下面是一个你不能用接口做的事情的例子:
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-12 07:13:29
你可以在大多数情况下,但可能你不应该。在接口中的默认功能是为了解决另一个问题。
当您无法更改现有的类时,例如在其他项目/库中,您希望扩展功能而不使用抽象类更改所有代码。
也许有一个抽象类是有意义的?具有行为但本身没有意义且必须进行扩展的对象应该更好地由类建模。如果您有有行为的Car类,那么您可以拥有适用于所有汽车的长度私有成员。私有成员不是接口的一部分。
https://stackoverflow.com/questions/59299305
复制相似问题