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 , Sub ou 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 , NotOverridable ou Overridable |
Utilisation de mots-clés | Shadows recommandé 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
, Sub
ou 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.