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


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

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

Сравнение

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

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

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

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

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

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

Руководящие принципы

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

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

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

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

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

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

См. также