Переопределение метода служит основанием для воплощения одного из самых эффективных в 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;
Deri'ved2 dOb2 = new Derived2;
Base baseRef; // ссылка на базовый класс
baseRef = baseOb; baseRef.Who ;
baseRef = dObl; baseRef.Who;
baseRef = d0b2; baseRef.Who;
}
}
Вот к какому результату приводит выполнение этого кода.
Метод Who в классе Base.
Метод Who в классе Derivedl Метод Who в классе Derived2
В коде из приведенного выше примера создаются базовый классBaseи два производных от него класса —DerivedlиDerived2.В классеBaseобъявляется виртуальный методWho , который переопределяется в обоих производных классах. Затем в методеMain объявляются объекты типаBase, DerivedlиDerived2.Кроме того, объявляется переменнаяbaseRefссылочного типаBase.Далее ссылка на каждый тип объекта присваивается переменнойbaseRefи затем используется для вызова методаWho . Как следует из результата выполнения приведенного выше кода, вариант выполняемого методаWho определяется по типу объекта, к которому происходит обращение по ссылке во время вызова этого метода, а не по типу класса переменнойbaseRef.
Но переопределять виртуальный метод совсем не обязательно. Ведь если в производном классе не предоставляется собственный вариант виртуального метода, то используется его вариант из базового класса, как в приведенном ниже примере.
/* Если виртуальный метод не переопределяется, то используется его вариант из базового класса. */
using System;
class Base {
// Создать виртуальный метод в базовом классе. public virtual void Who {
Console.WriteLine("Метод Who в классе Base");
}
}