首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中,我们可以用默认方法替换抽象类和接口吗

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

Stack Overflow用户
提问于 2019-12-12 07:02:19
回答 2查看 977关注 0票数 3

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

过去,我们有带有实例方法的抽象类,为它的所有实现类提供公共功能。

现在,我是否可以将那些具有实例方法的抽象类替换为那些在wards上拥有默认C# 8.0实现的接口?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-12 07:08:28

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

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

代码语言:javascript
复制
public abstract class NamedObject
{
    public string Name { get; }

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

    // Abstract methods here
}

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

票数 4
EN

Stack Overflow用户

发布于 2019-12-12 07:13:29

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59299305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档