Partager via


Différences entre l'occultation et la substitution (Visual Basic)

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

Comparaison

L’occultation et la substitution sont toutes deux utilisées lorsqu’une classe dérivée hérite d’une classe de base, et redéfinissent un élément déclaré avec un autre. Mais il y a des différences significatives entre les deux.

Le tableau suivant compare l’occultation et la substitution.

Point de comparaison Copie shadow Remplacement
Objectif Protège contre une modification de classe de base suivante qui introduit un membre que vous avez déjà défini dans votre classe dérivée Obtient le polymorphisme en définissant une implémentation différente d’une procédure ou d’une propriété avec la même séquenceappelante 1
Élément redéfini Tout type d’élément déclaré Seule une procédure (Function, Sub, ou Operator) ou une propriété
Redéfinition de l'élément Tout type d’élément déclaré Seule une procédure ou une propriété avec la séquence d’appel identique1
Niveau d’accès de l’élément redéfini Tout niveau d’accès Impossible de modifier le niveau d’accès de l’élément substitué
Lisibilité et capacité d'écriture de l'élément redéfinissant Toute combinaison Impossible de modifier la lisibilité ou l’écriture de la propriété substituée
Contrôle sur la redéfinition L'élément de la classe de base ne peut pas imposer ni interdire le masquage. L’élément de classe de base peut spécifier MustOverride, NotOverridableou Overridable
Utilisation des mots clés Shadows recommandé dans la classe dérivée ; Shadows est considéré si ni Shadows ni Overrides ne sont spécifiés2 Overridable ou MustOverride obligatoire dans la classe de base ; Overrides obligatoire dans la classe dérivée
Héritage de l’élément de redéfinition par des classes dérivant de votre classe dérivée Élément d’ombre hérité par d’autres classes dérivées ; Élément ombré toujours masqué3 Substitution d’un élément hérité par d’autres classes dérivées ; élément substitué toujours substitué

1 La séquence appelante se compose du type d’élément (Function, Sub, ou OperatorProperty), nom, liste de paramètres et type de retour. Vous ne pouvez pas remplacer une procédure par une propriété et inversement. Vous ne pouvez pas remplacer un type de procédure (Function, Subou Operator) par un autre type.

2 Si vous ne spécifiez pas l’un Shadows ou Overridesl’autre, le compilateur émet un message d’avertissement pour vous aider à être sûr du type de redéfinition que vous souhaitez utiliser. Si vous ignorez l’avertissement, le mécanisme d’ombre est utilisé.

3 Si l’élément d’ombre est inaccessible dans une autre classe dérivée, l’ombre n’est pas héritée. Par exemple, si vous déclarez l’élément d’ombre en tant que Private, une classe dérivant de votre classe dérivée hérite de l’élément d’origine au lieu de l’élément d’ombre.

Lignes directrices

Vous utilisez normalement la substitution dans les cas suivants :

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

  • Vous voulez vous assurer que le compilateur applique le même type d’élément et la même séquence d’appel.

Vous utilisez normalement l’ombre dans les cas suivants :

  • Vous prévoyez que votre classe de base peut être modifiée et définir un élément avec le même nom que le vôtre.

  • Vous souhaitez la liberté de modifier le type d’élément ou la séquence d’appel.

Voir aussi