Да я знаю, что 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") } }