logo search
[ТП]Lektsii / Лекция 2 Полиморфизм и виртуальные методы

Предотвращение переопределения виртуальных членов производными классами

Виртуальные члены остаются виртуальными без каких-либо ограничений в отношении количества классов, объявленных между виртуальным членом и классом, в котором он был изначально объявлен. Если в классе A объявляется виртуальный член и класс B является производным от класса A, а класс C является производным от класса B, то класс C наследует виртуальный член и обеспечивает возможность его переопределения независимо от того, было ли в классе B объявлено переопределение этого члена. В коде ниже приведен пример:

public class A

{

public virtual void DoWork() { }

}

public class B : A

{

public override void DoWork() { }

}

Производный класс может прекратить наследование, объявив переопределение как sealed. Для этого нужно добавить ключевое слово sealed перед ключевым словом override в объявлении члена класса. В коде ниже приведен пример:

C#

Копировать

public class C : B

{

public sealed override void DoWork() { }

}

В предыдущем примере метод DoWorkбольше не является виртуальным для любого класса, производного от C. Он по-прежнему является виртуальным для экземпляров C, даже если они преобразуются в тип Б или A. Запечатанные методы могут быть заменены производными классами с помощью ключевого словаnew, как показано в следующем примере:

public class D : C

{

public new void DoWork() { }

}

В этом случае при вызове метода DoWorkдля типа D с использованием переменной типа D вызывается новый методDoWork. Если для доступа к экземпляру типа D используется переменная типа C, B или A, то вызов методаDoWorkбудет подчиняться правилам виртуального наследования, направляя вызовы реализации методаDoWorkв классе C.

Доступ к виртуальным членам базового класса из производных классов

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

public class Base

{

public virtual void DoWork() {/*...*/ }

}

public class Derived : Base

{

public override void DoWork()

{

//Perform Derived's work here

//...

// Call DoWork on base class

base.DoWork();

}}