Рассмотрим следующий код (он немного длинный, но, надеюсь, вы сможете понять):
class A
{
}
class B : A
{
}
class C
{
public virtual void Foo(B b)
{
Console.WriteLine("base.Foo(B)");
}
}
class D: C
{
public override void Foo(B b)
{
Console.WriteLine("Foo(B)");
}
public void Foo(A a)
{
Console.WriteLine("Foo(A)");
}
}
class Program
{
public static void Main()
{
B b = new B();
D d = new D ();
d.Foo(b);
}
}
Если вы думаете, что результатом работы этой программы будет "Foo(B)", то вы будете в той же лодке, что и я: совершенно неправильно! На самом деле выводит "Foo(A)"
Если я удалю виртуальный метод из класса C
, он будет работать так, как ожидалось: "Foo(B)" будет выводом.
Почему компилятор выбирает версию, которая принимает A
, когда B
является более производным классом?
C
и удалю соответствующее ключевое словоoverride
изD
, вывод станет"Foo(B)"
. - person Fredrik Mörk   schedule 09.09.2010