class Derivedl : Base {
// Переопределить метод Who в производном классе.
public override void Who {
Console.WriteLine("Метод Who в классе Derivedl");
}
}
class Derived2 : Base {
// В этом классе метод Who не переопределяется.
}
class NoOverrideDemo { static void Main {
Base baseOb = new Base;
Derivedl dObl = new Derivedl;
Derived2 d0b2 = new Derived2;
Base baseRef; // ссылка на базовый класс
baseRef = baseOb; baseRef.Who;
baseRef = dObl ; baseRef.Who ;
baseRef = d0b2;
• baseRef.Who; // вызывается метод Who из класса Base}
}
Выполнение этого кода приводит к следующему результату.
Метод Who в классе Base.
Метод Who в классе Derivedl Метод Who в классе Base
В данном примере методWho не переопределяется в классеDerived2.Поэтому для объекта классаDerived2вызывается методWho из классаBase.
Если при наличии многоуровневой иерархии виртуальный метод не переопределяется в производном классе, то выполняется ближайший его вариант, обнаруживаемый вверх по иерархии, как в приведенном ниже примере.
/* В многоуровневой иерархии классов выполняется тот переопределенный вариант виртуального метода, который обнаруживается первым при продвижении вверх по иерархии. */
using System;
class Base {
// Создать виртуальный метод в базовом классе, public virtual void Who {
Console.WriteLine("Метод Who в классе Base");
}
}
class Derivedl : Base {
// Переопределить метод Who в производном классе. public override void Who {
Console.WriteLine("Метод Who в классе Derivedl");
}
}
class Derived2 : Derivedl {
// В этом классе метод Who не переопределяется.
}
class Derived3 : Derived2 {
//Ив этом классе метод Who не переопределяется.
}
class No0verrideDemo2 { static void Main {
Derived3 dOb = new Derived3;
Base baseRef; // ссылка на базовый класс
baseRef = dOb;
baseRef.Who; // вызов метода Who из класса Derivedl
}
}
Вот к какому результату приводит выполнение этого кода.
Метод Who в классе Derivedl
В данном примере классDerived3наследует классDerived2,который наследует классDerivedl,а тот, в свою очередь, — классBase.Как показывает приведенный выше результат, выполняется методWho , переопределяемый в классеDerivedl,поскольку это первый вариант виртуального метода, обнаруживаемый при продвижении вверх по иерархии от классовDerived3иDerived2,где методWho не переопределяется, к классуDerivedl.
И еще одно замечание: свойства также подлежат модификации ключевым словомvirtualи переопределению ключевым словомoverride.Это же относится и к индексаторам.
Что дает переопределение методов