Различия между сокрытием и переопределением

Обновлен: Ноябрь 2007

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

Сравнение

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

Следующая таблица представляет собой сравнение переобъявления и переопределения.

Точка сравнения

Переобъявление

Переопределение

Назначение

Защищает от последующей модификации базового класса, при которой включается уже определенный в производном классе член

Достижение полиморфизма за счет определения другой реализации процедуры или свойства с той же последовательностью вызова 1

Переопределяемый элемент

Объявленный элемент любого типа

Только процедура (Function, Sub или Operator) или свойство

Переопределяющий элемент

Объявленный элемент любого типа

Только процедура или свойство с такой же последовательностью вызова 1

Уровень доступа для переопределения элемента

Любой уровень доступа

Невозможно изменить уровень доступа переопределяемого элемента

Возможность чтения и записи переопределяющего элемента

В любой комбинации

Нельзя изменить возможность чтения и записи переопределяемого свойства

Управление переопределением

Базовый класс элемента не может применять или запрещать переобъявление

Элемент базового класса может указывать MustOverride, NotOverridable или Overridable

Использование ключевых слов

Рекомендуется использовать Shadows в производном классе. Если не указан ни Shadows, ни Overrides, то предполагается Shadows2

Overridable или MustOverride является обязательным в базовом классе. Overrides является обязательным в производном классе

Наследование переопределяющих элементов классами, производными от производного класса

Переобъявляющий элемент наследуется последующими производными классами. Переобъявляемый элемент остается скрытым3

Переопределяющий элемент наследуется производными классами. Переопределяемый элемент остается переопределенным

1Последовательность вызова состоит из типа элемента (Function, Sub, Operator или Property), имени, списка параметров и типа возвращаемого значения. Нельзя переопределить процедуру свойством и наоборот. Нельзя переопределить процедуру одного типа (Function, Sub или Operator) процедурой другого типа.

2 Если не указан либо Shadows, либо Overrides, компилятор выдает предупреждающее сообщение, помогающее убедиться в том, какой типа переопределения требуется использовать. Если проигнорировать предупреждение, используется механизм переобъявления.

3 Если переопределяющий элемент оказывается недоступным в последующем производном классе, переобъявление не наследуется. Например, если переобъявляющий элемент объявлен как Private, класс, полученный из производного класса, наследует первоначальный элемент вместо переобъявляющего.

Рекомендации

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

  • При определении полиморфизма производных классов.

  • Требуется обеспечить принудительное использование компилятором идентичных типов элементов и последовательностей вызова.

Переобъявление обычно используется в следующих случаях:

  • Предполагается, что базовый класс может быть изменен, и может быть определен элемент с аналогичным вашему элементу именем.

  • Требуется свобода изменения типа элемента или последовательности вызова.

См. также

Задачи

Практическое руководство. Различение двух элементов с одинаковыми именами

Практическое руководство. Сокрытие переменной с тем же именем, что и ваша переменная

Практическое руководство. Сокрытие наследуемой переменной

Практическое руководство. Доступ к переменной, скрытой производным классом

Основные понятия

Разрешение ссылки, когда несколько переменных имеют одинаковые имена

Сокрытие в Visual Basic

Ссылки

Shadows

Overrides

Другие ресурсы

Ссылки на объявленные элементы