![]() |
Delphi-Version: 2010
Schnittstelle-als-Schnittstelle-Umwandlung
Eine (generische) Schnittstellenreferenz ist gegeben. Nun möchte ich diese in eine andere generische (!) Schnittstelle umwandeln. Gibt es da eine Möglichkeit? (Der Kompiler sagt nein, leider.)
Delphi-Quellcode:
program Project1;
{$AppType Console} uses SysUtils, Classes; type ISchnittstelleA<T> = interface end; ISchnittstelleB<T> = interface end; TKlasse<T> = class(TInterfacedObject, ISchnittstelleA<T>, ISchnittstelleB<T>) end; type T = String; var O: TInterfacedObject; A: ISchnittstelleA<T>; B: ISchnittstelleB<T>; I: IInterface; begin try A := TKlasse<T>.Create; { Schnittstelle-als-Schnittstelle-Umwandlungen gehen nicht } // B := A as ISchnittstelleB<T>; // [DCC Fehler]: E2015 Operator ist auf diesen Operandentyp nicht anwendbar { und Schnittstelle-als-Objekt-als-Schnittstelle-Umwandlungen gehen nur mit "normalen" Schnittstellen, nicht aber mit generischen Schnittstellen. } O := A as TInterfacedObject; I := O as IInterface; { Wie kann man eine Schnittstellenreferenz vom Typ ISchnittstelleB<T> erhalten? } B := O as ISchnittstelleB<T>; // [DCC Fehler]: E2015 Operator ist auf diesen Operandentyp nicht anwendbar except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; ReadLn; end. |
AW: Schnittstelle-als-Schnittstelle-Umwandlung
Vieleicht
Delphi-Quellcode:
oder so
O.QueryInterface(ISchnittstelleB<T>, B)
Delphi-Quellcode:
?
I.QueryInterface(ISchnittstelleB<T>, B)
|
AW: Schnittstelle-als-Schnittstelle-Umwandlung
Das Problem ist, daß du bei generischen Schnittstellen keine GUID angeben kannst (du kannst schon, aber dann haben alle Instanzen die gleiche). Somit sind Dinge wie as und is nicht mehr möglich. Leider reduziert sich damit auch etwas der Nutzen generischer Interfaces.
Vielleicht hilft dir ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz