может быть свой вариант виртуального метода. Кроме того, виртуальные методы интересны тем, что именно происходит при их вызове по ссылке на базовый класс. В этом случае средствами языка C# определяется именно тот вариант виртуального метода, который следует вызывать, исходя изтипаобъекта, к которому происходит обращениепо ссылке, причем это делаетсяво время выполнения.Поэтому при ссылке на разные типы объектов выполняются разные варианты виртуального метода. Иными словами, вариант выполняемого виртуального метода выбирается по типу объекта, а не по типу ссылки на этот объект. Так, если базовый класс содержит виртуальный метод и от него получены производные классы, то при обращении к разным типам объектов по ссылке на базовый класс выполняются разные варианты этого виртуального метода.

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

Переопределение метода служит основанием для воплощения одного из самых эффективных в C# принципов:динамической диспетчеризации методов, которая представляет собой механизм разрешения вызова во время выполнения, а не компиляции. Значение динамической диспетчеризации методов состоит в том, что именно благодаря ей в C# реализуется динамический полиморфизм.

Ниже приведен пример, демонстрирующий виртуальные методы и их переопределение.

// Продемонстрировать виртуальный метод.

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 : Base {

// Вновь переопределить метод Who() в еще одном производном классе, public override void Who()    {

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

class OverrideDemo { static void Main() {

Base baseOb = new Base();

Derivedl dObl = new DerivedlO;

Перейти на страницу:

Похожие книги