19

Да я знаю, что override переопределяет virtual, а new затеняет, но чем они отличаются на практике? Пример

class A { public void DoSomeStuff(){} }

class B : A { public new void DoSomeStuff(){} }

Здесь я затенил, но если я захочу вызвать A.DoSomeStuff я могу просто обратиться к base. С другой стороны, если бы я использовал virtual и override, то чтобы вызвать переопределеный метод мне всеравно пришлось бы использовать base. В чем разница?

Vasya_P
  • 269

2 Answers2

31

Разница проявляется в случае полиморфизма. Если вы работаете с экземпляром класса-наследника через его родительский класс, то в случае, если вы будете вызывать переопределенный виртуальный метод (override), то будет вызвана его реализация из наследника, а если перекрытый (new), то будет вызван метод базового класса. Нагляднее будет увидеть на примере:

class Program
    {
        static void Main(string[] args)
        {
            Base derivedAsBase = new Derived();
        derivedAsBase.First();  // Derived.First(), выведет "First from Derived"                
        derivedAsBase.Second(); // Base.Second(), выведет "Second from Base"

        Console.ReadLine();
    }
}

class Base
{
    public virtual void First()
    {
        Console.WriteLine("First from Base");
    }

    public virtual void Second()
    {
        Console.WriteLine("Second from Base");
    }
}

class Derived : Base
{
    public override void First()
    {
        Console.WriteLine("First from Derived");
    }

    public new void Second()
    {
        Console.WriteLine("Second from Derived");
    }
}

DreamChild
  • 36,244
-1

Разница в использовании. когда вы как клиент (не знающий о его внутренностях) используете класс B:

var b = new B();
b.DoSomething();