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 des éléments de classe de base dans la classe dérivée. L'occultation et la substitution sont disponibles à cette fin.
Comparaison
Les mécanismes d'occultation et de substitution sont tous deux utilisés lorsqu'une classe dérivée hérite d'une classe de base et 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 |
Objectif |
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 : masquer une variable portant le même nom que votre variable (Visual Basic)
Comment : masquer une variable héritée (Visual Basic)
Comment : accéder à une variable masquée par une classe dérivée (Visual Basic)