Partage 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. Pour ce faire, il est possible de recourir à la mise en mémoire fantôme et à la substitution.

Comparaison

La mise en mémoire fantôme 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 existe des différences significatives entre les deux.

Le tableau suivant compare la mise en mémoire fantôme (shadowing) et la substitution (overriding).

Point de comparaison Copie shadow Remplacement
Objectif Protège contre une modification ultérieure de la classe de base 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équence appelante1
Élément redéfini Tout type d’élément déclaré Seule une procédure (Function, Subou Operator) ou une propriété
Redéfinir 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 de redéfinition Tout niveau d'accès Impossible de modifier le niveau d’accès de l’élément substitué
Lisibilité et écriture de l’élément de redéfinition Toute combinaison Impossible de modifier la lisibilité ou l’écriture de la propriété substituée
Contrôle de la redéfinition L’élément de classe de base ne peut pas appliquer ou interdire la mise en mémoire fantôme L’élément de classe de base peut spécifier MustOverride, NotOverridableou Overridable
Utilisation de mots-clés Shadowsrecommandé dans la classe dérivée ; Shadows supposé si Shadows ni Overrides spécifié2 Overridable ou MustOverride obligatoire dans la classe de base ; Overrides obligatoire dans la classe dérivée
Héritage de l’élément redéfinissant par des classes dérivant de votre classe dérivée Élément de mise en mémoire fantôme hérité par d’autres classes dérivées ; élément mis en mémoire fantôme toujours masqué3 Surcharge d'un élément hérité par d'autres classes dérivées ; l'élément surchargé reste surchargé

1 La séquence d’appel se compose du type d’élément (Function,Sub, Operator ou Property), nom, liste de paramètres et type de retour. Il n'est pas possible de remplacer une procédure par une propriété, ni l'inverse. Vous ne pouvez pas remplacer un type de procédure (Function, Subou Operator) par un autre type.

2 Si vous ne spécifiez Shadows pas ou Overrides, le compilateur émet un message d’avertissement pour vous aider à déterminer le type de redéfinition que vous souhaitez utiliser. Si vous ignorez l’avertissement, la mise en mémoire fantôme est utilisée.

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 de mise en mémoire fantôme comme 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 de mise en mémoire fantôme.

Consignes

Vous utilisez normalement la substitution dans les cas suivants :

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

  • Vous souhaitez que le compilateur applique le type d’élément et la séquence d’appel identiques.

Vous utilisez normalement la substitution dans les cas suivants :

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

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

Voir aussi