#c_sharp
Да я знаю, что override переопределяет virtual, а new затеняет, но чем они отличаются
на практике? Пример
class A { public void DoSomeStuff(){} }
class B : A { public new void DoSomeStuff(){} }
Здесь я затенил, но если я захочу вызвать A.DoSomeStuff я могу просто обратиться к base.
С другой стороны, если бы я использовал virtual и override, то чтобы вызвать переопределеный
метод мне всеравно пришлось бы использовать base. В чем разница?
Ответы
Ответ 1
Разница проявляется в случае полиморфизма. Если вы работаете с экземпляром класса-наследника через его родительский класс, то в случае, если вы будете вызывать переопределенный виртуальный метод (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"); } }Ответ 2
Разница в использовании. когда вы как клиент (не знающий о его внутренностях) используете класс B: var b = new B(); b.DoSomething();
Комментариев нет:
Отправить комментарий