interface A1 {
void jj();
void ff() { /* */}
}
class B1 : A1 {
public void jj() { }
void ff() { /* */}
}
Run Code Online (Sandbox Code Playgroud)
我在B1类中实现两个方法: the jj(),它在接口中没有默认实现A1,以及 the ff(),它在接口中具有默认实现A1。我想知道为什么我们在从接口实现方法时
不使用override
关键字,因为接口中的这些方法都是抽象或虚拟的?:
jj : Abstract
ff : virtual
10 年前,你可以说这是因为接口没有默认实现,这就是为什么我们不重写,而是实现。但是从 C# 8.0 开始默认实现是可能的,那么为什么我们没有义务使用 override 关键字呢?
正如 msdn 文档中关于默认接口成员的说法:
这些前面的成员声明通常不包含主体。从 C# 8.0 开始,接口成员可以声明主体。接口中的成员主体是默认实现。具有主体的成员允许接口为不提供重写实现的类和结构提供“默认”实现。
和:
从 C# 11 开始,接口可以定义静态抽象或静态虚拟成员来声明实现类型必须提供声明的成员。通常,静态虚拟方法声明实现必须定义一组重载运算符。
但是,override不应用关键字。可以在本教程中看到有关静态抽象接口方法的内容。
为什么我们没有义务使用 override 关键字
因为我们不是压倒行为,而是取代行为。我的意思是我们不能base在接口的具体实现上调用关键字。这就像使用new关键字而不是override