E2211 Deklaration von '%s' unterscheidet sich von der Deklaration in interface '%s' (Delphi)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Fehler- und Warnungsmeldungen (Delphi)

Die Methodendeklaration in einer Klasse, die eine Schnittstelle definiert, unterscheidet sich von der Definition, die in der Schnittstelle angegeben ist. Dieser Fehler kann folgende Gründe haben: Ein Parametertyp oder Rückgabewert wurde unterschiedlich deklariert, bei der Methode in der Klasse handelt es sich um eine Botschaftsmethode, der Bezeichner in der Klasse ist ein Feld oder eine Eigenschaft, die nicht mit der Definition in der Schnittstelle übereinstimmt.


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.

Fehler dieser Art fallen, wie im Beispiel ersichtlich, sofort ins Auge. Die Situation kann aber auch komplizierter sein, wie 'p1' zeigt. Da 'p1' eine Prozedur der geerbten Klasse überschreibt, erbt 'p1' auch die in der Basisklasse definierte Virtualität in der Prozedur.


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.

Verwenden Sie (wie im Beispiel gezeigt) für jeden problematischen Bezeichner eine Botschaftsauflösungsklausel. Grundsätzlicher lösen Sie das Problem, wenn Sie vor der Compilierung sicherstellen, dass die Klassenbezeichner mit den Schnittstellenbezeichnern kompatibel sind.