Différences entre l'occultation et la substitution

Mise à jour : novembre 2007

Lorsque vous définissez une classe qui hérite d'une classe de base, vous souhaitez parfois redéfinir un ou plusieurs des éléments de classe de base dans la classe dérivée. L'occultation et la substitution sont disponibles à cette fin.

Comparaison

Il est facile de confondre occulter et substituer. Elles sont toutes deux utilisées lorsqu'une classe dérivée hérite d'une classe de base et elles redéfinissent un élément déclaré par un autre. Il existe toutefois des différences importantes entre l'occultation et la substitution.

Le tableau suivant compare l'occultation à la substitution.

Point de comparaison

Occultation

Substitution

But

Protège contre une modification de classe de base suivante qui introduit un membre déjà défini dans votre classe dérivée

Atteint le polymorphisme en définissant une implémentation différente d'une procédure ou d'une propriété avec la même séquence d'appel 1

Élément redéfini

Tout type d'élément déclaré

Seulement une procédure (Function, Sub ou Operator) ou une propriété

Élément redéfinissant

Tout type d'élément déclaré

Seulement une procédure ou une propriété avec une séquence d'appel identique1

Niveau d'accès de l'élément redéfinissant

N'importe quel niveau d'accès

Impossible de modifier le niveau d'accès de l'élément substitué

Lisibilité et accessibilité en écriture de l'élément redéfinissant

Toute combinaison

Ne peut pas modifier la lisibilité et la facilité d'écriture de la propriété substituée

Contrôle sur la redéfinition

L'élément de classe de base ne peut pas appliquer ou interdire l'occultation

L'élément de classe de base peut spécifier MustOverride, NotOverridable ou Overridable

Utilisation de mot clé

Shadows recommandé dans la classe dérivée ; Shadows supposé lorsque ni Shadows ni Overrides ne sont spécifiés2

Overridable ou MustOverride requis dans la classe de base ; Overrides requis dans la classe dérivée

Héritage d'élément redéfinissant par des classes dérivant de votre classe dérivée

Élément occultant hérité par des classes plus dérivées ; élément occulté toujours masqué3

Élément substituant hérité par des classes plus dérivées ; élément substitué toujours substitué

1 La séquence d'appel se compose du type d'élément (Function, Sub, Operator ou Property), du nom, de la liste d'arguments et du type de retour. Vous ne pouvez pas substituer une procédure par une propriété, ou vice versa. Vous ne pouvez pas substituer un genre de procédure (Function, Sub ou Operator) par un autre genre.

2 Si vous ne spécifiez pas Shadows ou Overrides, le compilateur signale un message d'avertissement pour vous aider à vérifier le genre de redéfinition que vous souhaitez utiliser. Si vous ignorez l'avertissement, le mécanisme d'occultation est utilisé.

3 Si l'élément occultant est inaccessible dans une classe plus dérivée, l'occultation n'est pas héritée. Par exemple, si vous déclarez l'élément occultant comme Private, une classe dérivant de votre classe dérivée hérite de l'élément d'origine et non de l'élément occultant.

Indications

Vous utilisez normalement la substitution dans les cas suivants :

  • Vous définissez des classes dérivées polymorphes.

  • Vous souhaitez la sécurité du compilateur qui applique le type d'élément et la séquence d'appel identiques.

Vous utilisez normalement l'occultation dans les cas suivants :

  • Vous savez que votre classe de base peut être modifiée et peut définir un élément à l'aide du même nom que le vôtre.

  • Vous souhaitez pouvoir modifier le type d'élément ou la séquence d'appel.

Voir aussi

Tâches

Comment : faire la distinction entre deux éléments portant le même nom

Comment : masquer une variable portant le même nom que votre variable

Comment : masquer une variable héritée

Comment : accéder à une variable masquée par une classe dérivée

Concepts

Résolution d'une référence lorsque plusieurs variables ont le même nom

Occultation dans Visual Basic

Référence

Shadows

Overrides

Autres ressources

Références aux éléments déclarés