Различия между сокрытием и переопределением (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)