3 Stimmen

Wie kann ich den Typ des implementierenden Objekts einer Schnittstelle bestimmen?

Ich versuche, einen Einheitstest für eine einfache Fabrikklasse zu schreiben, die eines von mehreren möglichen Implementierungsobjekten erstellt und es als Schnittstellenreferenz zurückgibt.

Dunnit hat ein eingebautes Verfahren, CheckIs(AObject: TObject; AClass: TClass; msg: string) die aufgrund ihres Namens und der Parameter, die sie akzeptiert, den Test nicht bestehen sollte, wenn der Klassentyp des Objekts nicht mit dem erwarteten Typ übereinstimmt. Das einzige Problem ist, dass eine Objektreferenz und nicht eine Schnittstellenreferenz erforderlich ist.

Ich versuche also, die CheckTrue und führen Sie den Vergleich in den Körper des Tests, aber ich bin nicht so vertraut mit Delphi's Typüberprüfung Unterstützung als ich mit C#'s bin.

Ich kenne die is Operator kommt nicht in Frage, da er nur mit Objektreferenzen funktioniert.

CheckTrue(LMyInterfaceReference {comparison here} TMyClass);

Irgendwelche Vorschläge?

Ich verwende übrigens Delphi 2009 und habe daher keinen Zugriff auf die neue RTTI-Unterstützung, die in 2010+ hinzugefügt wurde.

4voto

jachguate Punkte 16748

Ich frage mich, warum Sie das testen MÜSSEN... vielleicht müssen Sie das wirklich nicht.

Wenn Sie aber unbedingt wissen müssen, welches Objekt einer Schnittstelle zugrunde liegt, haben Sie zwei Möglichkeiten:

  • Fügen Sie der Schnittstelle eine Methode hinzu, die das zugrundeliegende Objekt, einfach ein TObject, zurückgibt, und implementieren Sie dies in jeder Klasse, indem Sie einfach self zurückgeben.
  • Hacken Sie ein bisschen, zum Beispiel mit diesem Schnittstelle zum Objekt Routine.

4voto

Cosmin Prund Punkte 25218

Wenn Sie keine Hacks mögen und keine Lust haben, auf Delphi 2010+ zu aktualisieren, können Sie eine Schnittstelle wie diese verwenden:

IImplementingObjectInterface = interface
  function GetImplementingObject: TObject;
end;

Stellen Sie sicher, dass Ihre Objekte diese Schnittstelle ebenfalls implementieren und verwenden Sie sie, um das implementierende Objekt zu extrahieren. Wenn Sie dies für eine Vielzahl von Objekten tun müssen, können Sie Ihre eigene TInterfacedObject Derivate, die dies bereits implementieren, so dass Sie einfach Ihre Vererbung ändern können und fertig.

1voto

Barry Kelly (einer der Hauptentwickler des Embarcadero Delphi Compilers) schrieb eine schöne Eine hässliche Alternative zum Interface-to-Object-Casting diese Woche.

Das beantwortet Ihre Frage.

Der Spaß besteht darin, dass Hallvard Vassbotn schrieb eine ein sehr ähnliches Stück Code im Jahr 2004 .

Ab Delphi 2010 können Sie einfach eine is Scheck oder as cast, um von Schnittstellenreferenzen zu Objektreferenzen zurückzukehren.

--jeroen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X