为什么在实现接口方法时不使用关键字override?C#

5
interface A1 {
    void jj();
    void ff() { /*  */}
}

class B1 : A1 {
    public void jj() { }
    void ff() { /*  */}
}

我正在 B1 类中实现两种方法:jj() 在接口 A1 中没有默认实现,而 ff() 在接口 A1 中有默认实现。

我想知道为什么在实现接口方法时不使用 override 关键字,因为接口中的这些方法是抽象或虚拟的?
jj: 抽象
ff: 虚拟

10年前,你可以说这是因为接口没有默认实现,所以我们不需要覆盖,而是实现。但是,从 C# 8.0 开始,可以使用默认实现,那么为什么我们不必须使用 override 关键字呢?


如果规则在默认实现出现后要求使用override,那么所有使用接口的先前代码都将无效。如果这是可选的事情,那么为什么要费心呢? - Flydog57
充分的理由,谢谢Flydog57。 - Jason9789
你没有覆盖任何东西,那么为什么你想要这个关键字呢? - DavidG
@DavidG,这也是问题的一部分:为什么我们不覆盖? - Jason9789
2个回答

1

来自 c# 8 文档

类 C 中 IA.M 的最终重写是在 IA 中声明的具体方法 M。请注意,类不会从其接口继承成员;这个特性不会改变这一点:

因为接口实现不会被其子类继承,所以没有必要进行重写。每个接口方法的声明都是子类唯一的实现方式。


1
根据 msdn 文档关于 默认接口成员 的说明:
这些前置成员声明通常不包含主体。从 C# 8.0 开始,接口成员可以声明主体。接口中的成员主体是默认实现。具有主体的成员允许接口为未提供覆盖实现的类和结构提供“默认”实现。
还有:
从 C# 11 开始,接口可以定义静态抽象或静态虚成员来声明实现类型必须提供已声明的成员。通常,静态虚拟方法声明实现必须定义一组重载运算符。
然而,并没有应用 override 关键字。可以在 关于静态抽象接口方法的教程 中看到。
为什么我们不需要使用 override 关键字?
因为我们不是覆盖行为,而是替换行为。我的意思是,我们不能在接口的具体实现中调用基类关键字base。这就像使用new关键字而不是override

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接