При наследовании унаследованного класса поведение 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
. Почему модификатор new
класса B имеет здесь приоритет? Каков вариант его использования? Тем более, что он нарушает очевидный вариант использования
Обратите внимание, что приведенный выше код был запущен на Mono 2.10, работающем в дистрибутиве, производном от Debian, но я подтвердил такое же поведение с помощью компилятора C# в MS Visual Studio.