Предотвращение переопределения виртуальных членов производными классами
Виртуальные члены остаются виртуальными без каких-либо ограничений в отношении количества классов, объявленных между виртуальным членом и классом, в котором он был изначально объявлен. Если в классе 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();
}}
- Лекция . Процедуры и функции - функциональные модули и методы класса
- Процедуры и функции. Отличия
- Описание методов. Синтаксис
- Использование модификаторов ref и out для ссылок на объекты
- Вызов метода. Синтаксис
- О соответствии списков формальных и фактических аргументов
- Вызов метода. Семантика
- Что нужно знать о методах?
- Перегрузка методов
- Полиморфизм. Виртуальные методы
- Скрытие членов базового класса с новыми членами
- Предотвращение переопределения виртуальных членов производными классами
- Индексаторы