在继承继承类时,新的/覆盖行为不是我所期望的:
$ cat Program.cs
using System;
class A {
public virtual void SayHi() {
Console.WriteLine("From A");
}
}
class B : A {
public new virtual void SayHi() {
Console.WriteLine("From B");
}
}
class C : B {
public override void SayHi() {
Console.WriteLine("From C");
}
}
public class Program {
public static void Main() {
A p = new C();
p.SayHi();
}
}
$ ./Program.exe
From A
因为C类覆盖了sayHi()方法,所以我希望输出为From C
。为什么B类的new
修饰符在这里优先?它的用例是什么?特别是当它打破了让C真正覆盖A的明显用例的时候。
请注意,上面的代码是在Mono2.10上运行的,Mono2.10运行在Debian派生的发行版上。但我已经使用MS Visual Studio中的C#编译器确认了相同的行为。
https://stackoverflow.com/questions/11039414
复制相似问题