Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Result im generischen Objekt vorbelegen. (https://www.delphipraxis.net/188460-result-im-generischen-objekt-vorbelegen.html)

bernau 5. Mär 2016 22:39

Result im generischen Objekt vorbelegen.
 
Ich will in einer generischen Klasse das Result festlegen, obwohl ich den Type gar nicht kenne.

Ich weis nicht ob das so verständlich beschrieben ist, daher mal ein Beispiel:

Delphi-Quellcode:
type
 TMyGenType<TSonstwas> = class
   private
   protected
     Function MyDefaultValue:TSonstwas;virtual;
   public
end;

Function TMyGenType<TSonstwas>.MyDefaultValue:TSonstwas;
begin
  if TSonstwas is integer then
    integer(Result) := 42;
  if TSonstwas is String then
    string(Result) := '42';
end;
In der Funktion MyDefaultValue möchte ich vorab für einige Typen das Result festlegen. Ein Typecasting und der "is"-Parameter funktionieren natürlich nicht.

Ich habe zwar mittlerweile herausgefunden, wie man mit Hilfe von TValue aus der Rtti-Unit den Typen herausfinden kann. Somit kann ich das "is" schon mal ersetzen. Aber dem Result kann ich nichts zuweisen. Ich weiss zumindest nicht wie. Jemand eine Idee?

Zacherl 5. Mär 2016 23:00

AW: Result im generischen Objekt vorbelegen.
 
Funktioniert evtl.
Delphi-Quellcode:
PInteger(@Result)^ := 42
?

Namenloser 5. Mär 2016 23:06

AW: Result im generischen Objekt vorbelegen.
 
Vielleicht funktioniert es mit einem Variant?

Delphi-Quellcode:
Function TMyGenType<TSonstwas>.MyDefaultValue:TSonstwas;
var
  Value: Variant;
begin
  Value := 42;
  Result := Value;
end;

bernau 7. Mär 2016 09:56

AW: Result im generischen Objekt vorbelegen.
 
@Namenloser: Die Variante geht leider nicht.

@Zacherl: Deine Variante funktioniert. Habe ich mit Integer und Double getestet.

himitsu 7. Mär 2016 09:56

AW: Result im generischen Objekt vorbelegen.
 
Delphi-Quellcode:
function TMyGenType<TSonstwas>.MyDefaultValue: TSonstwas;
begin
  Result := Default;
  ...
end;

madas 7. Mär 2016 10:47

AW: Result im generischen Objekt vorbelegen.
 
Zitat:

Zitat von himitsu (Beitrag 1332271)
Delphi-Quellcode:
function TMyGenType<TSonstwas>.MyDefaultValue: TSonstwas;
begin
  Result := Default;
  ...
end;

Liefert aber sicher nicht die gewünschte 42 bzw. den String '42'. ;)

Btw.: der Sinn hinter der "function" erschließt sich mir noch nicht so wirklich. O-Ton MS "Generic classes encapsulate operations that are not specific to a particular data type." und dies wäre bei der "function" ja schon nicht mehr der Fall, da eine gewisse Abhängigkeit zu bestimmten Typen vorhanden ist.

himitsu 7. Mär 2016 11:02

AW: Result im generischen Objekt vorbelegen.
 
Achso, dann mal mit TValue versuchen.
Delphi-Quellcode:
Result := TValue(42).AsType<T>;
Result := TValue(42).Cast<T>;
...
Selbst wenn der Compiler
Delphi-Quellcode:
Result := TSonstwas(42);
erlaubt, wird es so eh nicht gehen, denn bei einem String kommt da nur Schrott bei raus.

bernau 7. Mär 2016 13:43

AW: Result im generischen Objekt vorbelegen.
 
Zitat:

Zitat von madas (Beitrag 1332276)
Liefert aber sicher nicht die gewünschte 42 bzw. den String '42'. ;)

Btw.: der Sinn hinter der "function" erschließt sich mir noch nicht so wirklich. O-Ton MS "Generic classes encapsulate operations that are not specific to a particular data type." und dies wäre bei der "function" ja schon nicht mehr der Fall, da eine gewisse Abhängigkeit zu bestimmten Typen vorhanden ist.

Ich habe das Beispiel gewählt, weil ich eigentlich nur wissen wollte, wie man den Result mit einem Wert belegen kann. Der Sinn ist hier tatsächlich wertfrei.

Hintergrund ist ein generisches Objekt in dem ich einige Berechnungen durchführe. Als Typen für den Generischen Parameter sollen verschiedene numerische Typen verwendet werden. Von dem Objekt gibt es unterschiedliche Ableitungen. Wenn ich nun die mathematische Funktion erst am Ende der Vererbungskette implementiere, dann muss mehrfach die gleiche Berechnung Programmiert werden. Das will ich mir sparen, in dem ich die Berechnung schon in der Wurzel der Vererbungskette implementiere. Dort steht allerdings noch nicht der Type des generischen Parameters fest.

bernau 7. Mär 2016 13:46

AW: Result im generischen Objekt vorbelegen.
 
Zitat:

Zitat von himitsu (Beitrag 1332278)
Selbst wenn der Compiler
Delphi-Quellcode:
Result := TSonstwas(42);
erlaubt, wird es so eh nicht gehen, denn bei einem String kommt da nur Schrott bei raus.

Bei einem String würde ich früh genug eine Exception auslösen.

bernau 7. Mär 2016 13:53

AW: Result im generischen Objekt vorbelegen.
 
Zitat:

Zitat von himitsu (Beitrag 1332278)
Achso, dann mal mit TValue versuchen.
Delphi-Quellcode:
Result := TValue(42).AsType<T>;
Result := TValue(42).Cast<T>;
...

Delphi-Quellcode:
Result := TValue(42).AsType<T>;
Das Funktioniert. Sieht für mich sogar eleganter aus, als die Pointer-Geschichte. Danke.


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