У меня есть простой базовый класс и производный класс:
class Base
{
public virtual void Write(int value)
{
Console.WriteLine("base int: {0}", value);
}
public virtual void Write(string value)
{
Console.WriteLine("base string: {0}", value);
}
}
class Derived : Base
{
public override void Write(int value)
{
Console.WriteLine("derived int: {0}", value);
}
public virtual void Write(IEnumerable enumerable)
{
Console.WriteLine("derived IEnumerable: {0}", enumerable);
}
public virtual void Write(object o)
{
Console.WriteLine("derived obj: {0}", o);
}
}
Если я запускаю это:
static void Main(string[] args)
{
Derived d = new Derived();
Console.WriteLine("derived:");
d.Write(42);
d.Write("hello");
Console.WriteLine("base:");
Base b = d;
b.Write(42);
b.Write("hello");
}
Я получаю:
derived:
derived obj: 42
derived IEnumerable: hello
base:
derived int: 42
base string: hello
Но я ожидаю, что "b.Write (42)" и "d.Write (42)" будут идентичны. То же самое для строкового регистра.
Что я не понимаю? Как я могу получить поведение, которое я ожидаю, учитывая ограничение, что я не могу изменить «База»?
ОБНОВЛЕНИЕ : См. сообщение Эрика .