Verwendung der Funktion Supports () mit generischem Schnittstellentyp

9

Ich habe gerade meine erste Verwendung von Generics in Delphi 2009 versucht und bin perplex darüber, wie man einen generischen Typ als Eingabe für die Supports-Funktion verwendet, um zu sehen, ob ein Objekt eine bestimmte Schnittstelle implementiert. Ich habe ein kleines Beispiel zur Veranschaulichung des Problems erstellt.

Angesichts der folgenden Typen und Dienstprogrammfunktion:

%Vor%

und das folgende Code-Snippet:

%Vor%

Ich würde keine Probleme erwarten, aber ich bekomme die folgenden Kompilierzeitfehler:

  

[DCC Fehler] GenericExample.pas (37): E2029 '(' erwartet aber ',' gefunden   [DCC Error] GenericExample.pas (37): E2014 Statement erwartet, aber Ausdruck des Typs 'T' gefunden

Ich bin mir nicht sicher, was der Compiler von mir erwartet, wenn ich das T als Argument für die Funktion verwende.

Ich habe ziemlich viel gesucht und konnte diesen nicht knacken. Ein Teil von mir vermutet, dass, wenn ich verstehen könnte, wie ein Interface-Name während der Kompilierung in den IID: TGUID-Typ konvertiert wird, wenn ich einen konkreten Interface-Namen verwende, könnte ich auch Fortschritte machen.

Jede Hilfe wird sehr geschätzt.

    
Chad 11.12.2010, 18:34
quelle

2 Antworten

8

Es gibt keine Garantie, dass T eine GUID zugeordnet hat, und es gibt in der Sprache keine Möglichkeit, eine Einschränkung für den Typparameter zu schreiben, um diese Garantie zu erstellen.

Der Name der Schnittstelle wird vom Compiler in eine GUID umgewandelt, wobei der Name in der Symboltabelle nachgeschlagen wird, die Datenstruktur des Compilers die Schnittstelle darstellt und das entsprechende Feld für die GUID geprüft wird. Aber Generika sind nicht wie C ++ - Vorlagen; Sie müssen kompiliert und typisiert sein und wissen, dass sie für jeden gültigen Typparameter funktionieren, und das bedeutet, dass der Typparameter in seiner Deklaration eingeschränkt wird.

Sie können die GUID mithilfe von RTTI abrufen (zuerst prüfen, ob T tatsächlich eine Schnittstelle darstellt) mit etwas wie GetTypeData(TypeInfo(T))^.Guid und die GUID auf diese Weise an Supports übergeben.

    
Barry Kelly 11.12.2010, 19:44
quelle
3

Warum stören Sie überhaupt?

Um dieses TFunctions.GetInterface zu verwenden, benötigen Sie:

  • eine Schnittstelle
  • eine Objektreferenz

Wenn Sie diese haben, können Sie einfach Supports () direkt aufrufen:

%Vor%

ist genau entspricht:

%Vor%

Die Verwendung von Generika ist hier eine Verschwendung von Zeit und Mühe und wirft die Frage auf, warum es so ist.

Es erschwert lediglich das Lesen (wie es bei Generika oft der Fall ist) und ist umständlicher zu verwenden.

Supports () gibt einen passenden booleschen Wert zurück, um Erfolg / Misserfolg anzuzeigen, den Sie separat mit Ihrem Wrapper testen müssen:

%Vor%

versus:

%Vor%

Beim Erstellen von Wrappern um die Funktionalität herum führt dies im Allgemeinen zu einer Verbesserung der Lesbarkeit oder Benutzerfreundlichkeit.

Das schlägt in beiden Fällen fehl, und Sie sollten nur bei der Funktion Supports () bleiben.

    
Deltics 12.12.2010 03:42
quelle

Tags und Links