Сила этих ключевых слов вступает в игру, когда вы используете полиморфизм
Я думаю, что пример помогает понять больше всего. Учтите следующее:
class Base {
public virtual void f() { Console.WriteLine("Virtual Base"); }
}
class Override : Base {
public override void f() { Console.WriteLine("Overridden derived"); }
}
class New : Base {
public new void f() { Console.WriteLine("New derived"); }
}
Теперь, когда у вас есть объект фактического типа Derived
, но статического типа Base
, вызов f()
все равно выдаст «Переопределенный производный»:
Base obj = new Override();
obj.f(); // Overridden derived
С ключевым словом new
вы указываете среде выполнения прекратить поиск метода с таким именем, начиная с этого класса:
Base obj = new New();
obj.f(); // Virtual Base
В отличие от вызова f()
для типа не менее New
:
New obj = new New();
obj.f(); // New derived