C# 覆盖重叠法
问题很短,但我没有找到解决办法 假设我们有类层次结构C# 覆盖重叠法,c#,.net,cil,C#,.net,Cil,问题很短,但我没有找到解决办法 假设我们有类层次结构 public abstract class A { public virtual string Print() { return "A"; } } public class B : A { public virtual new string Print() { return "B"; } } public class C : B { public override string Print() { return "
public abstract class A
{
public virtual string Print() { return "A"; }
}
public class B : A
{
public virtual new string Print() { return "B"; }
}
public class C : B
{
public override string Print() { return "C"; }
}
可以在C类中重写A.打印吗?我尝试将其作为显式接口实现:
string A.Print() { return "C"; }
但这里我得到一个错误:
显式接口声明中的“A”不是接口
我认为这根本不可能,但如果您能收到任何其他信息,我将不胜感激。我还没有尝试过,但您可以轻松地-
interface IA
{
string Print();
}
interface IB
{
string Print();
}
public abstract class A : IA
{
IA.Print() { return "A"; }
}
public class B : IB, A
{
IB.Print() { return "B"; }
}
不能在C#中使用,但可以在IL中使用.override
关键字来覆盖该方法将使用的vtable插槽。(注意:方法名Namespace.A.Print
并不重要,在方法名中包含完整的类型名只是一种避免冲突的有用方法,就像C#对显式接口实现所做的那样)
您的问题同时标记为C#和CIL。你想在C#中这样做,还是愿意在CIL中编写
C
。@svick因为我不确定在C#或IL中是否可行,所以请看Brian的答案。现在你知道为什么我在问题中添加了cil标签:)用于IL,+1!纯粹的恶棍:)
.class public auto ansi beforefieldinit Namespace.C
extends [x]Namespace.B
{
.method private hidebysig virtual
instance string Namespace.A.Print () cil managed
{
.override method instance string [x]Namespace.A::Print()
.maxstack 1
ldstr "C"
ret
}
}