AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wieder generische Functions results

Ein Thema von QuickAndDirty · begonnen am 14. Mai 2019 · letzter Beitrag vom 15. Mai 2019
Antwort Antwort
Seite 1 von 2  1 2      
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#1

Wieder generische Functions results

  Alt 14. Mai 2019, 12:27
Delphi-Version: 10.2 Tokyo
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?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Wieder generische Functions results

  Alt 14. Mai 2019, 12:52
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;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Wieder generische Functions results

  Alt 14. Mai 2019, 12:55
Das der Cast nach T funktionieren kann, müssen bestimmte Informationen über T vorliegen.

Haben die Typen einen gemeinsamen Vorfahr?
Markus Kinzler
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#4

AW: Wieder generische Functions results

  Alt 14. Mai 2019, 13:40
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
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#5

AW: Wieder generische Functions results

  Alt 14. Mai 2019, 13:40
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.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#6

AW: Wieder generische Functions results

  Alt 14. Mai 2019, 13:52
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?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#7

AW: Wieder generische Functions results

  Alt 14. Mai 2019, 14:19
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...
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (14. Mai 2019 um 17:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.344 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Wieder generische Functions results

  Alt 15. Mai 2019, 06:27
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke (15. Mai 2019 um 06:32 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#9

AW: Wieder generische Functions results

  Alt 15. Mai 2019, 11:20
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.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (15. Mai 2019 um 11:44 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#10

AW: Wieder generische Functions results

  Alt 15. Mai 2019, 11:33
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;
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:42 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