x2269: La méthode virtuelle redéfinie '%s.%s' a une visibilité inférieure (%s) que la classe de base '%s' (%s) (Delphi)

De RAD Studio
Aller à : navigation, rechercher

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.

  1. Ignorer le conseil
  2. Modifier la visibilité pour qu'elle corresponde à celle de la classe de base
  3. 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.