Чем отличаются override и new

1,00
р.
Да я знаю, что override переопределяет virtual, а new затеняет, но чем они отличаются на практике? Пример
class A { public void DoSomeStuff(){} }
class B : A { public new void DoSomeStuff(){} }
Здесь я затенил, но если я захочу вызвать A.DoSomeStuff я могу просто обратиться к base. С другой стороны, если бы я использовал virtual и override, то чтобы вызвать переопределеный метод мне всеравно пришлось бы использовать base. В чем разница?


Ответ
Разница проявляется в случае полиморфизма. Если вы работаете с экземпляром класса-наследника через его родительский класс, то в случае, если вы будете вызывать переопределенный виртуальный метод (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") } }