Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Generic ToString? (https://www.delphipraxis.net/182301-generic-tostring.html)

Whookie 16. Okt 2014 08:53

Generic ToString?
 
Ist ein Generic ToString möglich?

Beispiel:
Delphi-Quellcode:
Type
  TMyVar<T> = Class
    Value: T;
    function ToString: String
  End;
Wie würde ToString zu implementieren sein?

Delphi-Quellcode:
   Result := Value.ToString
geht leider nicht und prüfen mit "Is" geht nicht immer.

mkinzler 16. Okt 2014 08:57

AW: Generic ToString?
 
Nein, .ToString() wird nicht von allen Typen unterstützt und kann deshalb so nicht vorausgesetzt werden.

Der schöne Günther 16. Okt 2014 09:35

AW: Generic ToString?
 
Du könntest vielleicht deinen Typ auf einen Wrapper einschränken, beispielsweise
Delphi-Quellcode:
System.Rtti.TValue

Sir Rufo 16. Okt 2014 11:38

AW: Generic ToString?
 
Achtung das müsste eigentlich
Delphi-Quellcode:
override
gekennzeichnet werden Delphi-Referenz durchsuchenTObject.ToString

Der schöne Günther 16. Okt 2014 11:41

AW: Generic ToString?
 
Wieso überladen? Er will doch an der Signatur nichts ändern.

Dass er das override vergisst müsste ja auch in seinen Warnungen stehen ;-)

Sir Rufo 16. Okt 2014 11:45

AW: Generic ToString?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1276170)
Wieso überladen? Er will doch an der Signatur nichts ändern.

Dass er das override vergisst müsste ja auch in seinen Warnungen stehen ;-)

Das wollte ich eigentlich auch sagen, hab mich da wohl im Wortregal vergriffen :stupid:

Whookie 16. Okt 2014 12:09

AW: Generic ToString?
 
ja, war mal wieder zu "theoretisch" momentan sieht das so aus:

Delphi-Quellcode:
function ToString: TStringList; reintroduce;

und die Abfragen erfolgen so:


Delphi-Quellcode:
function TMyVar<T>.ToString: TStringList;
begin
  Result := TStringList.Create;
  if ClassName.Contains('Integer') Then
    ConvIntegerToSL(Result)
  else if ClassName.Contains('TMyClass') then
    .. usw.
end;

Sir Rufo 16. Okt 2014 12:20

AW: Generic ToString?
 
Aua, da kannst du dir aber schöne Speicherlecks mit erstellen :)

Und diese BasisMethode so zu vergewaltigen ist auch nicht ratsam. Dafür würde ich eine eigene Methode einführen
Delphi-Quellcode:
ToStrings : TStrings
obwohl ich da eher zu
Delphi-Quellcode:
TArray<string>
tendieren würde, da gibt es keine Lecks.

Mit
Delphi-Quellcode:
TValue.From<T>.AsString
kann man auch eine Menge erschlagen

Whookie 16. Okt 2014 13:08

AW: Generic ToString?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1276188)
Aua, da kannst du dir aber schöne Speicherlecks mit erstellen :)

Ist ein Argument, ich kopier das am ende in ein TArray<String> um und geb die Liste selber frei

Das mit TValue krieg ich aber irgendwie nicht hin, ich hab eine rekursiv aufgerufene Methode die wie folgt aussieht:

Delphi-Quellcode:
procedure TWrapVariable<T>.DoConvertToString(const Lvl: Integer; const x: TVariable<T>; const ALst: TStringList);
var
  i: Integer;
  iVi: TVariable<Integer>;
  iVf: TVariable<Single>;
  iVs: TVariable<AnsiString>;
  iVb: TVariable<Boolean>;
  s: String;
begin
  if Length(x.FVarArr)=0 then
  begin
    if (fVarType = gicInteger) then
    begin
      x.AsVariable(iVi);
      s:= TValue.From<TVariable<T>>(x).AsString; // comiled zwar wirft aber eine EInvalidCast
      fToStrBuffer := fToStrBuffer + Format('%d,', [iVi.FValue]);
    end
    else if (fVarType = gicFloat) then
    begin
      x.AsVariable(iVf);
      fToStrBuffer := fToStrBuffer + Format('%1.5f,', [iVf.FValue]);
    end
    ....
  end;

  for i := Low(x.FVarArr) to High(x.FVarArr) do
  begin
    DoConvertToString(Lvl+1, x.FVarArr[i] As TVariable<T>, ALst);
  end;


  if (Length(x.FVarArr) <> 0) Or (Lvl=0) then
  begin
    ALst.Add(fToStrBuffer);
    fToStrBuffer := '';
  end;
end;
weiter hinten wird dann über das interne fVarArr iteriert und im anschluß der fToStrBuffer-String der Stringliste
hinzugefügt.

Stevie 16. Okt 2014 17:11

AW: Generic ToString?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1276188)
Mit
Delphi-Quellcode:
TValue.From<T>.AsString
kann man auch eine Menge erschlagen

Mit
Delphi-Quellcode:
ToString
bitte. AsString wird dich anspringen, wenn T irgendwas nicht string zuweisungskompatibles ist. So wie alle TValue.AsXXX Methoden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:44 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