При наследовании унаследованного класса поведение new/override не то, что я ожидаю:
$ 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.
Обратите внимание, что приведенный выше код был запущен в Mono 2.10, запущенный в дистрибутиве Debian. Но я подтвердил то же поведение, используя компилятор С# в MS Visual Studio.