Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wieder generische Functions results (https://www.delphipraxis.net/200669-wieder-generische-functions-results.html)

QuickAndDirty 14. Mai 2019 12:27

Delphi-Version: 10.2 Tokyo

Wieder generische Functions results
 
Ich versuche sowas
Delphi-Quellcode:
class Function TWSClient.GetClient<T>(Addr: string):T
var RIO: THTTPRIO;
begin
  //Result := nil;// Das geht schonmal nicht aber ok
  RIO := GetLocalRio;
  try
    Result := (RIO as T);//[dcc32 Fehler] E2015 Operator ist auf diesen Operandentyp nicht anwendbar
    RIO.URL := Addr;
  finally
   // if (Result = nil) then // Das geht dann natürlich auch nicht
   //   RIO.Free;
  end;
End;
wie geht das?

Neutral General 14. Mai 2019 12:52

AW: Wieder generische Functions results
 
Du kannst/musst angeben von welchem Typ "T" sein muss.
Du kannst da z.B. "class" verwenden oder einen Basistypen:
Delphi-Quellcode:
class Function GetClient<T: class>(Addr: string):T;
// oder
class Function GetClient<T: THTTPRIO>(Addr: string):T;

mkinzler 14. Mai 2019 12:55

AW: Wieder generische Functions results
 
Das der Cast nach T funktionieren kann, müssen bestimmte Informationen über T vorliegen.

Haben die Typen einen gemeinsamen Vorfahr?

QuickAndDirty 14. Mai 2019 13:40

AW: Wieder generische Functions results
 
Zitat:

Zitat von Neutral General (Beitrag 1432208)
Du kannst/musst angeben von welchem Typ "T" sein muss.
Du kannst da z.B. "class" verwenden oder einen Basistypen:
Delphi-Quellcode:
class Function GetClient<T: class>(Addr: string):T;
// oder
class Function GetClient<T: THTTPRIO>(Addr: string):T;

T soll IInvocable sein...also ein Interface typ

QuickAndDirty 14. Mai 2019 13:40

AW: Wieder generische Functions results
 
Zitat:

Zitat von mkinzler (Beitrag 1432209)
Das der Cast nach T funktionieren kann, müssen bestimmte Informationen über T vorliegen.

Haben die Typen einen gemeinsamen Vorfahr?

Ja der gemeinsame Vorfahre von T ist IInvocable.

QuickAndDirty 14. Mai 2019 13:52

AW: Wieder generische Functions results
 
in der Classe
Delphi-Quellcode:
interface
...
Type
....

Class Function GetClient<T: IInvokable>(Addr: string):T;
Delphi-Quellcode:
implementation
...
Class Function TWSClient.GetClient<T>(Addr: string):T;//Hier darf man nicht <T:IInvokable> schreiben...
var RIO: THTTPRIO;
begin
  //Result := nil;
  RIO := GetLocalRio;
  try
    Result := (RIO as T);//[dcc32 Fehler] E2015 Operator ist auf diesen Operandentyp nicht anwendbar
    RIO.URL := Addr;
  finally
    //if (Result = nil) then // Das geht dann natürlich auch nicht
    //  RIO.Free;
  end;
End;
meldet immer noch das selbe

Liegt das eventuell an der Referenzzählung? also können evtl. records, strings und interfaces generell keine Generics sein?

QuickAndDirty 14. Mai 2019 14:19

AW: Wieder generische Functions results
 
Das hier compiliert
Delphi-Quellcode:
interface
...
Type
....

Class Function GetClient<T: IInterface>(Addr: string):T;
Delphi-Quellcode:
Class Function TWSClient.GetClient<T>(Addr: string):T;
var RIO: THTTPRIO;
begin
  Result := nil;
  RIO := GetLocalRio;
  try
    //Result := (RIO as T);//[dcc32 Fehler] E2015 Operator ist auf diesen Operandentyp nicht anwendbar
    Result := T(RIO);//Das geht
    RIO.URL := Addr;
  finally
    if (Result = nil) then // Das geht dann natürlich auch nicht
      RIO.Free;
  end;
End;
Wie wirkt sich hardcast vs softcast auf Android, Apple und windows aus wenn man eine Klasse hart in ein Interface castet?
EDIT:
hard Cast arbeitet nicht vernünftig mit der Referenzzählung zusammen...das Objekt ist einfach weg wenn man es so macht... :(

jaenicke 15. Mai 2019 06:27

AW: Wieder generische Functions results
 
Benutze Supports um das Interface auf den richtigen Typ zu casten. Das funktioniert bei uns problemlos, wir machen etwas ähnliches.

// EDIT:
THTTPRIO implementiert doch IInvokable gar nicht.

QuickAndDirty 15. Mai 2019 11:20

AW: Wieder generische Functions results
 
Zitat:

Zitat von jaenicke (Beitrag 1432246)
Benutze Supports um das Interface auf den richtigen Typ zu casten. Das funktioniert bei uns problemlos, wir machen etwas ähnliches.

// EDIT:
THTTPRIO implementiert doch IInvokable gar nicht.

Delphi generiert sowas für webservices
Delphi-Quellcode:
function GetWSClient(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): IWSClient;
const
  defWSDL = 'C:\IWSClient.xml';
  defURL = 'http://localhost:80/soap/IWSClient';
  defSvc = 'IWSClient';
  defPrt = 'IWSClient_Port';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as IWSClient);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;
Ich habe nur alles entfernt was ich nicht brauche und das interface durch <T> ersetzt
die Interfaces aus der generierten datei sind von IInvokable abgeleitet ...allerdings scheint das auch nur ein Alias für IInterface zu sein....

Ich versuche es mal mit supports und gebe feedback.

QuickAndDirty 15. Mai 2019 11:33

AW: Wieder generische Functions results
 
Delphi-Quellcode:
//  deklaration
Class Function GetClient<T:IInterface>(Addr: string):T;
Das hier lässt sich nicht kompilieren :(
Delphi-Quellcode:
Class Function TWSClient.GetClient<T>(Addr: string):T;
var RIO: THTTPRIO;
begin
  Result := nil;
  RIO := GetLocalRio;
  try
    //Result := (RIO as T);//[dcc32 Fehler] E2015 Operator ist auf diesen Operandentyp nicht anwendbar
    //Result := T(RIO);//Das geht Aber es produziert zugriffsverletzungen... dank Refcount;
    if Supports(RIO,T,Result) then//[dcc32 Fehler] E2250 Es gibt keine überladene Version von 'Supports', die man mit diesen Argumenten aufrufen kann
      RIO.URL := Addr
    else
      Result := nil;
  finally
    if (Result = nil) then
      RIO.Free;
  end;
End;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:42 Uhr.
Seite 1 von 2  1 2      

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