x2269: La méthode virtuelle redéfinie '%s.%s' a une visibilité inférieure (%s) que la classe de base '%s' (%s) (Delphi)
Remonter à Messages d'erreur et d'avertissement (Delphi)
La méthode indiquée dans le message d'erreur a été déclarée comme redéfinition d'une méthode virtuelle dans une classe de base, mais la visibilité déclarée dans la classe actuelle est inférieure à celle de la classe de base pour la même méthode.
Alors que les règles de visibilité du Pascal semblent indiquer que la fonction ne peut être vue, les règles d'invocation des fonctions virtuelles font que la fonction est correctement invoquée dans un appel virtuel.
Habituellement, ceci signifie que la méthode de la classe dérivée a été déclarée dans une section private ou protected, alors que la méthode de la classe de base a été déclarée dans une section protected ou pubic (y compris published).
unit Produce; interface type Base = class(TObject) public procedure VirtualProcedure(X: Integer); virtual; end; Extended = class (Base) protected procedure VirtualProcedure(X: Integer); override; end; implementation procedure Base.VirtualProcedure(X: Integer); begin end; procedure Extended.VirtualProcedure(X: Integer); begin end; end.
L'exemple ci-dessus montre bien comment ce problème est suscité par la présence de Extended.VirtualProcedure dans la section protected.
En pratique, il n'y a pas de risque, mais il peut y avoir des confusions lors de la lecture de la documentation et observant les attributs de visibilité sur le document.
Le conseil se manifeste uniquement pour les classes apparaissant dans la section interface d'une unité.
unit Solve; interface type Base = class(TObject) public procedure VirtualProcedure(X: Integer); virtual; end; Extended = class (Base) public procedure VirtualProcedure(X: Integer); override; end; implementation procedure Base.VirtualProcedure(X: Integer); begin end; procedure Extended.VirtualProcedure(X: Integer); begin end; end.
Les principales solutions à ce problème sont au nombre de trois.
- Ignorer le conseil
- Modifier la visibilité pour qu'elle corresponde à celle de la classe de base
- Mettre la définition de la classe dans la section d'implémentation.
Dans l'exemple ci-dessus, la visibilité de la méthode a été modifiée pour correspondre à la classe de base.