这背后的设计原理是什么:
好的:
public class A
{
public virtual void DoWork() { Console.WriteLine("A"); }
}
public class B : A
{
private new void DoWork() { Console.WriteLine("B"); } //private works
}
public class C : B
{
public override void DoWork() { Console.WriteLine("C"); }
}
错误的:
public class A
{
public virtual void DoWork() { Console.WriteLine("A"); }
}
public class B : A
{
public new void DoWork() { Console.WriteLine("B"); } //public doesn't
}
public class C : B
{
public override void DoWork() { Console.WriteLine("C"); }
}
为什么非虚拟方法无论如何都会干扰覆盖虚拟方法?
编辑:更多解释。第一种情况:编译器检查该方法是否为私有(新),因此它允许 C.DoWork() 类覆盖 A.DoWork() 类(不混合虚拟和非虚拟(B.DoWork())方法)。第二种情况:编译器看到声明了 public(new)void 并且它任意(?)破坏了 C 类中的覆盖。现在,如果我想声明 new virtual DoWork() 我可以这样做,如果我想禁止覆盖,我本可以使用密封说明符。但是在这种情况下,我将 public void DoWork() 写为声明正常的非虚拟方法,并且我不希望它像在私有情况下那样参与虚拟继承链。在第二个示例中,我期望:
A ac = new C();
ac.DoWork();
像在私人情况下一样打印 C。