E2211 La déclaration de '%s' diffère de la déclaration dans l'interface '%s' (Delphi)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Messages d'erreur et d'avertissement (Delphi)

Une méthode déclarée dans une classe implémentant une interface est différente de la définition apparaissant dans l'interface. Les causes probables : le type d'un paramètre ou d'une valeur renvoyée est déclaré différemment, la méthode apparaissant dans la classe est une méthode message, l'identificateur dans la classe est un champ ou l'identificateur dans la classe est une propriété, ce qui ne correspond pas à la définition de l'interface.


program Produce;

  type
    IBaseIntf = interface
      procedure p0(var x : Shortint);
      procedure p1(var x : Integer);
      procedure p2(var x : Integer);
    end;

    TBaseClass = class (TInterfacedObject)
      procedure p1(var x : Integer); message 151;
    end;

    TExtClass = class (TBaseClass, IBaseIntf)
      p2 : Integer;
      procedure p0(var x : Integer);
      procedure p1(var x : Integer); override;
    end;

  procedure TBaseClass.p1(var x : Integer);
  begin
  end;

  procedure TExtClass.p0(var x : Integer);
  begin
  end;

  procedure TExtClass.p1(var x : Integer);
  begin
  end;

begin
end.

Généralement, comme dans cet exemple, les erreurs de ce type sont suffisamment claires pour être facilement visibles. Cependant, comme nous pouvons le voir avec p1, les choses peuvent être plus subtiles. Puisque p1 redéfinit une procédure de la classe héritée, p1 hérite aussi de la virtualité de la procédure définie dans la classe de base.


program Solve;

  type
    IBaseIntf = interface
      procedure p0(var x : Shortint);
      procedure p1(var x : Integer);
      procedure p2(var x : Integer);
    end;

    TBaseClass = class (TInterfacedObject)
      procedure p1(var x : Integer); message 151;
    end;

    TExtClass = class (TBaseClass, IBaseIntf)
      p2 : Integer;

      procedure IBaseIntf.p1 = p3;
      procedure IBaseIntf.p2 = p4;

      procedure p0(var x : Shortint);
      procedure p1(var x : Integer); override;
      procedure p3(var x : Integer);
      procedure p4(var x : Integer);
    end;

  procedure TBaseClass.p1(var x : Integer);
  begin
  end;

  procedure TExtClass.p0(var x : Shortint);
  begin
  end;

  procedure TExtClass.p1(var x : Integer);
  begin
  end;

  procedure TExtClass.p3(var x : Integer);
  begin
  end;

  procedure TExtClass.p4(var x : Integer);
  begin
  end;

begin
end.

Une approche pour résoudre ce problème est d'utiliser une clause de résolution de message pour chaque identificateur problématique, comme dans notre exemple. Une autre approche viable, qui requiert une conception plus poussée, serait de vérifier que les identificateurs de classe sont compatibles avec ceux d'interface avant la compilation.