Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ответы по Технологии программирования / Виртуальные методы и их переопределение

.docx
Скачиваний:
8
Добавлен:
21.05.2015
Размер:
8 Кб
Скачать

Виртуальным называется метод, объявляемый с помощью ключевого слова virtual в базовом классе и переопределяемый в одном или нескольких производных классах. Таким образом, каждый производный класс может иметь собственную версию виртуального метода. Виртуальные методы представляют интерес с такой позиции: что произойдет, если виртуальный метод будет вызван посредством ссылки на базовый класс. Какую именно версию метода нужно вызвать, С# определяет по типу объекта, на который указываетэта ссылка, причем решение принимается динамически, во времявыполнения программы. Следовательно, если имеются ссылки на различныеобъекты, будут выполняться различныеверсии виртуального метода. Другими словами, именно тип объекта, на который указывает ссылка (а не тип ссылки) определяет, какая версия виртуального метода будет выполнена. Таким образом, если базовый класс содержит виртуальный метод и из этого класса выведены производные классы, то при наличии ссылки на различные типы объектов (посредством ссылки на базовый класс) будут выполняться различные версии этого виртуального метода.

Чтобы объявить метод в базовом классе виртуальным, его объявление необходимо предварить ключевым словом virtual . При переопределении виртуального метода в производном классе используется модификатор override. Итак, процесс переопределения виртуального метода в производном классе иногда называется замещениемметода(methodoverriding). При переопределении метода сигнатуры типа у виртуального и метода-заменителя должны совпадать. Кроме того, виртуальный метод нельзя определять как статический (с использованием слова static) или абстрактный (с использованием слова abstract).

Переопределение виртуального метода формирует базу для одной из самых мощных концепций С#: динамической диспетчеризации методов. Динамическая диспетчеризация методов — это механизм вызова переопределенного метода во время выполнения программы, а не в период компиляции. Именно благодаря механизму диспетчеризации методов в С# реализуется динамический полиморфизм.

// Демонстрация виртуального метода.

usingSystem;

classBase {

// Создаем виртуальный метод в базовом классе,

public virtual void who () {

Console.WriteLine("Метод who() вклассе Base.");

}}

classDerived1 :Base {

// Переопределяем метод who() в производном классе,

public override void who() {

Console.WriteLine("Метод who() вклассе Derived1")

}}

classDerived2 :Base {

// Сновапереопределяемметодwho()

// в другом производном классе,

publicoverridevoidwho() {

Console.WriteLine("Метод who() вклассе Derived2

}}

class OverrideDemo {

public static void Main() {

Base baseOb = new Base();

Derived1dOb1 = newDerived1()

Derived2 dOb2 = new Derived2()

Base baseRef; // Ссылканабазовыйкласс.

baseRef = baseOb;

baseRef.who();

baseRef = dOb1;

baseRef.who() ;

baseRef = dOb2;

baseRef.who() ;

}}

Вот результаты выполнения этой программы:

Метод who() в классе Base.

Метод who() в классе Derived1

Метод who() в классе Derived2

В программе создается базовый класс Base и два производных класса — Derived1 и Derived2. В классе Base объявляется метод с именем who(), а производные классы его переопределяют. В методе Main() объявляются объекты типа Base, Derived1 и Derived2, а также ссылка baseRef типа Base. Затем программа поочередно присваивает ссылку на объект каждого типа ссылке baseRef и использует эту ссылку для вызова метода who(). Как показывают результаты выполнения этой программы, нужная для выполнения версия определяется типом объекта, адресуемого в момент вызова, а не "классовым" типом ссылки baseRef.

Виртуальный метод переопределять необязательно. Если производный класс не предоставляет собственную версию виртуального метода, используется версия, определенная в базовом классе. Если производный класс не переопределяет виртуальный метод в случае многоуровневой иерархии, то будет выполнен первый переопределенный метод, который обнаружится при просмотре иерархической лестницы в направлении снизу вверх.

Свойства также можно модифицировать с помощью ключевого слова virtual, а затем переопределять с помощью ключевого слова override.