Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
При определении класса, наследуемого от базового класса, иногда требуется переопределить один или несколько элементов базового класса в производном классе. Затенение и переопределение доступны для этой цели.
Сравнение
Скрытие и переопределение используются, когда производный класс наследует от базового, и оба метода служат для замены одного объявленного элемента другим. Но между этими двумя существуют значительные различия.
В следующей таблице сравнивается затенение с переопределением.
Точка сравнения | Затенение | Переопределение |
---|---|---|
Цель | Защищает от последующего изменения базового класса, которое вводит член, уже определенный в вашем производном классе. | Достигает полиморфизма путем определения другой реализации процедуры или свойства с той же вызывающей последовательностью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
, класс, являющийся производным от вашего производного класса, наследует исходный элемент вместо теневого.
Руководящие принципы
Вы обычно используете переопределение в следующих случаях:
Вы определяете полиморфные производные классы.
Необходимо обеспечить безопасность применения компилятором идентичного типа элемента и последовательности вызовов.
Обычно вы используете тени в следующих случаях:
Вы предполагаете, что ваш базовый класс может быть изменён, и определяете элемент, используя то же имя, что и у вас.
Вы хотите иметь свободу изменения типа элемента и последовательности вызовов.