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

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

Сравнение

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

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

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

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

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

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

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

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

  • Вы определяете полиморфные производные классы.

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

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

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

  • Вы хотите, чтобы свобода изменения типа элемента или последовательности вызовов.

См. также