![]() |
Delphi-Version: 10.2 Tokyo
Wieder generische Functions results
Ich versuche sowas
Delphi-Quellcode:
wie geht das?
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; |
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; |
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? |
AW: Wieder generische Functions results
Zitat:
|
AW: Wieder generische Functions results
Zitat:
|
AW: Wieder generische Functions results
in der Classe
Delphi-Quellcode:
interface
... Type .... Class Function GetClient<T: IInvokable>(Addr: string):T;
Delphi-Quellcode:
meldet immer noch das selbe
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; Liegt das eventuell an der Referenzzählung? also können evtl. records, strings und interfaces generell keine Generics sein? |
AW: Wieder generische Functions results
Das hier compiliert
Delphi-Quellcode:
interface
... Type .... Class Function GetClient<T: IInterface>(Addr: string):T;
Delphi-Quellcode:
Wie wirkt sich hardcast vs softcast auf Android, Apple und windows aus wenn man eine Klasse hart in ein Interface castet?
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; EDIT: hard Cast arbeitet nicht vernünftig mit der Referenzzählung zusammen...das Objekt ist einfach weg wenn man es so macht... :( |
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. |
AW: Wieder generische Functions results
Zitat:
Delphi-Quellcode:
Ich habe nur alles entfernt was ich nicht brauche und das interface durch <T> ersetzt
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; 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. |
AW: Wieder generische Functions results
Delphi-Quellcode:
Das hier lässt sich nicht kompilieren :(
// deklaration
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 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 10:47 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