Einzelnen Beitrag anzeigen

Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#1

Method Resolution Clause --> Undeclared Identifier

  Alt 16. Jan 2017, 17:20
Hallo Delphianer,

ich habe gerade ein sehr kurioses Problem. Ich habe drei Interfaces die voneinander nichts wissen. Also keine Ableitung kein gar nix. Alle drei Interfaces stellen die Methode Init() bereit. Jetzt habe ich eine Klasse die alle drei Interfaces implementiert.

Jetzt muss ich ja die Init Methoden von mindestens zwei Interfaces so implementieren, damit der Compiler weiß, welche Methode gemeint ist (Method Resolution Clause).

Bei zwei Interfaces funktioniert das auch problemlos, aber sobals das dritte Interface hinzu kommt, erhalte ich den Fehler, dass die Methode nicht deklariert sei.

Beispiel:

Delphi-Quellcode:
IInterface1 = interface
  function Init: Boolean; stdcall;
end;

IInterface2 = interface
  function Init: Boolean; stdcall;
end;

IInterface3 = interface
  function Init: Boolean; stdcall;
end;
Delphi-Quellcode:
TTestClass = class(TInterfacedObject, IInterface1, IInterface2, IInterface3
private
  function I2Init: Boolean;
  function I3Init: Boolean;
public
  function Init: Boolean; // Init aus IInterface1
  function IInterface2.Init = I2Init;
  function IInterface3.Init = I3Init;
end;
Sobald ich jetzt F9 drücke erscheint die Meldung "Undeklarierter Bezeichner: I3Init". Nehme ich die Method Resolution Clause (MRC) von I3Init raus (auskommentieren), dann wird mir nur die Meldung "I3Init wurde deklariert aber nie verwendet" ausgegeben. Eine Fehlermeldung das Init aus IInterface3 nicht implementiert sei erscheint nicht. Ist auch klar, weil ich ja eine Init Methode ohne MRC implementiert habe. Sobald ich dann die Methode aus IInterface1 auch mit einer MRC versehe erscheint auch die Meldung, dass Init aus IInterface3 nicht implementiert ist. Ist ja dann auch korrekt.

Jetzt kommt es aber. Versehe ich alle Methoden mit einer MRC, dann erscheint bei zwei ein Fehler (IInterface1 und IInterface3).

Wenn ich jetzt die MRC für I3Init rausnehme, dann meldet er auch, dass I3Init deklariert aber nicht verwendet wurde. Also er findet die Methode, aber nur wenn die MRC nicht eingetragen ist.

Weshalb ist das so? Ich hoffe mir kann jemand helfen. Ich hoffe ich übersehe nur etwas. So kann ich mein Projekt nämlich nicht mehr kompilieren.


Vielleicht als abschließende Frage weil es irgendwo zum Thema passt: Warum kann ich keine Direktiven (wie z.B. stdcall ) bei den Methoden angeben die ich mit einer MRC auflösen musste?
  Mit Zitat antworten Zitat