Поделиться через


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

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

Сравнение

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

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

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

Затенение

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

Назначение

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

Достижение полиморфизма за счет определения другой реализации процедуры или свойства с той же последовательностью вызова 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)

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

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

Ссылки

Shadows (Visual Basic)

Overrides (Visual Basic)

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

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

Сокрытие в Visual Basic