在C#中,如果所有接口成员默认都是public和abstract的,为什么我们不能在实现类时使用override呢?虽然我们可以在抽象类中使用重写。
interface IExample
{
int Ara();
}
class Matematiksel : IExample
{
public override int Ara()
{
return 3;
}
}
CS0115:Matematiksel.Ara():找不到合适的方法来覆盖。 抽象类示例
{
public abstract int Ara();
}
class Math1 : Example
{
public override int Ara()
{
return 2;
}
}
第一个不起作用,而第二个则正常。
接口方法和抽象方法是两个不同的概念。
通过在接口
IExample
中定义成员,您要求任何实现 IExample
的类或结构(或从 IExample
继承的接口)都必须具有具有匹配签名的成员。对于方法,匹配的方法可以是抽象的或虚拟的,但它必须是公共的或显式的实现。在编译时,确定每个实现类和结构的哪些成员满足要求并被定义为实现。如果接口将泛型与 in
和 out
共变和逆变修饰符结合使用,那么接口比抽象方法有更多的选择。对于属性,当实现属性具有 get
和 get
时,接口可能需要 set
。
如果您定义了
abstract
成员,则这是继承类的不同类型的要求。最值得注意的是,抽象成员可以受到保护,并且抽象仅存在于类中,因为无法继承结构来实现抽象成员。抽象方法的签名具有明确定义的类型,在此上下文中不存在同变体和逆变变体。
您还可以定义一个
virtual
方法。这告诉运行时,从类型层次结构中的任何级别调用方法时,可能有一个更具体的方法要调用。因此,调用虚拟方法意味着运行时必须在类型定义的虚拟方法查找表中查找“最佳”方法,然后调用该方法,而与变量类型无关。然而,虚拟方法仍然是具有方法体的实际方法,可以使用 base.
进行调用。
abstract
和 virtual
是更密切相关的概念,区别在于 abstract
表示“这里没有实际的方法体可以调用”。
对于接口变量,明确定义了将调用哪个方法并且映射优先。对于抽象和虚拟,运行时必须查找要调用的实际方法。
override
关键字仅用于abstract
和virtual
情况,不适用于interface
。它指的是重写继承层次结构中的实际方法定义,而接口仅仅是给定类或结构必须适应的模型,并且接口成员连接到在编译时被视为实现的实际成员时间。
C# 是否可以设计为在实现接口方法时也必须编写
override
?是的。但这根本不是他们定义语言的方式。