E2211 Deklaration von '%s' unterscheidet sich von der Deklaration in interface '%s' (Delphi)
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.