namespace SomeStuff
{
class MainClass
{
public static void Main (string[] args)
{
A a = new A();
B b = new B();
A c = new C();
a.Display();
b.Display();
c.Display();
}
public class A
{
public virtual void Display()
{
Console.WriteLine("A");
}
}
public class B : A
{
public override void Display ()
{
Console.WriteLine("B");
}
}
public class C : B
{
public new void Display()
{
Console.WriteLine("C");
}
}
}
}
Ну почему выводит:
A
B
B
Почему выводит перегруженный метод класса, базового класса для C?
Спасибо!
Все правильно делает. Тип указан как A, метод — виртуальный, иерархия метода кончается на B, создается подтип типа B. При вызове метода производится проверка перегрузок по иерархии наследования, где наиболее подходящая перегрузка — у класса B.
Потому что переменная с имеет тип А, а значит новый (new) метод класса С просто не виден — виден только одноименный виртуальный метод A, перекрытый (override) в В, после чего унаследованный С, а значит будет вызван именно он.
Если чуть точнее — то новый метод просто не относится к определенной выше иерархии наследования. А совпадение имен — это просто случайность, которая не имеет для компилятора какого-то особого смысла. Так что метод мог бы называться DisplayInC(), и в отношении наследования ничего бы не поменялось.