В чем заключается конструктивное обоснование этого:
OK:
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"); }
}
Почему не виртуальный метод все равно мешает переопределению виртуального метода?
РЕДАКТИРОВАТЬ: Больше объяснений. 1-й случай: компилятор проверяет, что метод является закрытым (новым), поэтому он позволяет классу C.DoWork() переопределить класс A.DoWork() (не смешивает виртуальные и невиртуальные (B.DoWork()) методы). 2-й случай: компилятор видит, что объявлен public (new) void и произвольно(?) прерывает переопределение в классе C. Теперь, если бы я хотел объявить новый виртуальный DoWork(), я мог бы это сделать, если бы хотел запретить переопределение, Я мог бы использовать запечатанный спецификатор. Но в этом случае я написал public void DoWork() как объявление обычного невиртуального метода, и я не ожидаю, что он будет участвовать в цепочке виртуального наследования, как в частном случае. Во втором примере я ожидаю:
A ac = new C();
ac.DoWork();
вывести C как в частном случае.