Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Schnittstelle-als-Schnittstelle-Umwandlung (https://www.delphipraxis.net/157210-schnittstelle-als-schnittstelle-umwandlung.html)

Panthrax 3. Jan 2011 11:11

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.

Blup 3. Jan 2011 11:58

AW: Schnittstelle-als-Schnittstelle-Umwandlung
 
Vieleicht
Delphi-Quellcode:
O.QueryInterface(ISchnittstelleB<T>, B)
oder so
Delphi-Quellcode:
I.QueryInterface(ISchnittstelleB<T>, B)
?

Uwe Raabe 3. Jan 2011 12:08

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 dieser Artikel etwas weiter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz