Второй пример, который вы показали, скрывает GetData родителя, он не переопределяет его.
Пример:
private class Base
{
public virtual void Test()
{
Console.WriteLine("Base");
}
public void Test2()
{
Console.WriteLine("Base");
}
}
private class Derived : Base
{
public override void Test()
{
Console.WriteLine("Derived");
}
public void Test2()
{
Console.WriteLine("Derived");
}
}
static void Main()
{
Base b = new Base();
Derived d = new Derived();
Base dInB = new Derived();
b.Test();
d.Test();
dInB.Test();
b.Test2();
d.Test2();
dInB.Test2();
Console.ReadKey(true);
}
Он выводит:
Base // Base.Test()
Derived // Derived.Test()
Derived // Derived.Test()
Base // Base.Test2()
Derived // Derived.Test2()
Base // You think you're calling Derived.Test2(), but you actually call Base.Test2()
На самом деле этот пример недопустим, потому что он должен использовать ключевое слово new
в public new void Test2()
в классе Derived.
Он работает так же, как перегрузка операторов.Это на самом деле ничего не отменяет.Когда у вас есть точный тип Derived
, он вызывает новый метод.
Вы должны быть очень осторожны с сокрытием членов, это совсем не похоже на переопределение (классы) или реализацию (интерфейсы) вообще.Только если у вас есть тип точный , он вызовет метод new
, в противном случае он по-прежнему будет вызывать метод базового типа!