Я пытаюсь понять концепцию затенения в C#. Это мой код, который не ведет себя, как я ожидать, что это:Затенение в C# - базовый метод вызывается вместо производного
public class Animal
{
public virtual void Foo()
{
Console.WriteLine("Foo Animal");
}
}
public class Dog : Animal
{
public new void Foo()
{
Console.WriteLine("Foo Dog");
}
}
class Program
{
static void Main(string[] args)
{
Dog dog1 = new Dog();
((Animal)dog1).Foo();
Animal dog2 = new Dog();
dog2.Foo();
}
}
Когда код в Main
выполняется, Foo()
из базового класса (Animal
) называется, и от того, что я читал о слежке, Foo()
от Dog
следует называть. Может кто-нибудь объяснить, что мне не хватает?
Мой пример в соответствии с этим: https://msdn.microsoft.com/en-us/library/ms173153.aspx
UPDATE: Это пример из MSDN:
class Program
{
static void Main(string[] args)
{
BaseClass bc = new BaseClass();
DerivedClass dc = new DerivedClass();
BaseClass bcdc = new DerivedClass();
// The following two calls do what you would expect. They call
// the methods that are defined in BaseClass.
bc.Method1();
bc.Method2();
// Output:
// Base - Method1
// Base - Method2
// The following two calls do what you would expect. They call
// the methods that are defined in DerivedClass.
dc.Method1();
dc.Method2();
// Output:
// Derived - Method1
// Derived - Method2
// The following two calls produce different results, depending
// on whether override (Method1) or new (Method2) is used.
bcdc.Method1();
bcdc.Method2();
// Output:
// Derived - Method1
// Base - Method2
}
}
class BaseClass
{
public virtual void Method1()
{
Console.WriteLine("Base - Method1");
}
public virtual void Method2()
{
Console.WriteLine("Base - Method2");
}
}
class DerivedClass : BaseClass
{
public override void Method1()
{
Console.WriteLine("Derived - Method1");
}
public new void Method2()
{
Console.WriteLine("Derived - Method2");
}
}
Когда bcdc.Method1()
выполняется, Method1()
из производного класса вызывается, который ISN» Случай в моем примере.
Каких точный бит заставляет ожидать, что 'Foo()' 'метод из Dog' будет называться? В обоих случаях вы вызываете его через выражение с типом времени компиляции 'Animal'. –
Возможный дубликат [C#: новый или переопределение] (http://stackoverflow.com/questions/1399127/c-new-versus-override) –
«Автомобиль»/«Конвертируемый автомобиль/Минивэн» показывает, что вы пытаясь сделать. На той же странице. – xanatos