Я начал понимать, что я не понимаю, что происходит. В С# существует следующее поведение:
public class Base
{
public void Method(D a)
{
Console.WriteLine("public void Method(D a)");
}
}
public class Derived: Base
{
public void Method(B a)
{
Console.WriteLine("public void Method(B a)");
}
}
public class B { }
public class D: B { }
class Program
{
static void Main(string[] args)
{
Derived derived = new Derived();
D d = new D();
derived.Method(d);
}
}
Он напечатает
public void Method(B a)
вместо
public void Method(D a)
Это удивительно. Я полагаю, что причиной такого поведения является реализация таблицы методов. CLR не ищет методы в базовом классе, если находит соответствующий метод в текущем типе. Я думаю, что они пытались улучшить производительность.
Но я был полностью разочарован следующим кодом:
public class Base
{
public virtual void Method(D a)
{
Console.WriteLine("public void Method(D a)");
}
}
public class Derived: Base
{
public override void Method(D a)
{
Console.WriteLine("public override void Method(D a)");
}
public void Method(B a)
{
Console.WriteLine("public void Method(B a)");
}
}
public class B { }
public class D: B { }
class Program
{
static void Main(string[] args)
{
Derived derived = new Derived();
D d = new D();
derived.Method(d);
}
}
и он напечатает
public void Method(B a)
вместо
public override void Method(D a)
Это ужасно и очень непредсказуемо.
Кто-нибудь может это объяснить?
Я полагаю, что таблица методов имеет методы, которые были реализованы только в текущем типе (исключая методы переопределения), и CLR перестает искать соответствующий метод, как только будет найден любой метод, который может быть вызван. Я прав?