Различия между сокрытием и переопределением (Visual Basic)
При определении класса, наследуемого от базового класса, иногда требуется переопределить один или несколько элементов базового класса в производном классе. Тени и переопределение доступны для этой цели.
Сравнение
Тени и переопределение используются, когда производный класс наследует от базового класса, а оба — переопределение одного объявленного элемента с другим. Но между этими двумя существуют значительные различия.
В следующей таблице сравнивается тень с переопределением.
Точка сравнения | Удаленное управление | Переопределение |
---|---|---|
Характер использования | Защищает от последующего изменения базового класса, которое представляет элемент, который уже определен в производном классе. | Достигает полиморфизма путем определения другой реализации процедуры или свойства с той же вызывающей последовательностью1 |
Переопределенный элемент | Любой объявленный тип элемента | Только процедура (Function или Sub ) или Operator свойство |
Переопределенный элемент | Любой объявленный тип элемента | Только процедура или свойство с идентичной последовательностью вызовов1 |
Уровень доступа к элементу переопределения | Любой уровень доступа | Не удается изменить уровень доступа переопределенного элемента |
Удобочитаемость и возможность записи элемента переопределения | Любое сочетание | Не удается изменить удобочитаемость или возможность записи переопределенного свойства |
Контроль над переопределениями | Элемент базового класса не может применять или запрещать тень | Элемент базового класса может указывать MustOverride , NotOverridable или Overridable |
Использование ключевых слов | Shadows рекомендуется в производном классе; Shadows предполагается, если ни ни Shadows Overrides не задано2 |
Overridable или MustOverride обязательный в базовом классе; Overrides обязательный в производном классе |
Наследование элемента переопределения по классам, производным от производного класса | Теневой элемент, унаследованный дальнейшими производными классами; теневой элемент по-прежнему скрыт3 | Переопределение элемента, наследуемого дальнейшими производными классами; Переопределенный элемент по-прежнему переопределен |
1 Последовательность вызовов состоит из типа элемента (Function
,, Sub
Operator
илиProperty
), имени, списка параметров и типа возвращаемого значения. Невозможно переопределить процедуру свойством или наоборот. Нельзя переопределить одну процедуру (Function
илиSub
Operator
) с другим типом.
2 Если вы не укажете Shadows
Overrides
или компилятор выдает предупреждение, чтобы убедиться, какой тип переопределения вы хотите использовать. Если вы игнорируете предупреждение, используется механизм тени.
3 Если элемент тени недоступен в дополнительном производном классе, тень не наследуется. Например, если объявить теневой элемент как Private
класс, производный от производного класса, наследует исходный элемент вместо теневой.
Рекомендации
Обычно используется переопределение в следующих случаях:
Вы определяете полиморфные производные классы.
Необходимо обеспечить безопасность применения компилятором идентичного типа элемента и последовательности вызовов.
Обычно вы используете тени в следующих случаях:
Предполагается, что базовый класс может быть изменен и определен элемент, используя то же имя, что и ваше.
Вы хотите, чтобы свобода изменения типа элемента или последовательности вызовов.