![]() |
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:
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.
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; 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? |
AW: Result im generischen Objekt vorbelegen.
Funktioniert evtl.
Delphi-Quellcode:
?
PInteger(@Result)^ := 42
|
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; |
AW: Result im generischen Objekt vorbelegen.
@Namenloser: Die Variante geht leider nicht.
@Zacherl: Deine Variante funktioniert. Habe ich mit Integer und Double getestet. |
AW: Result im generischen Objekt vorbelegen.
Delphi-Quellcode:
function TMyGenType<TSonstwas>.MyDefaultValue: TSonstwas;
begin Result := Default; ... end; |
AW: Result im generischen Objekt vorbelegen.
Zitat:
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. |
AW: Result im generischen Objekt vorbelegen.
Achso, dann mal mit TValue versuchen.
Delphi-Quellcode:
Selbst wenn der Compiler
Result := TValue(42).AsType<T>;
Result := TValue(42).Cast<T>; ...
Delphi-Quellcode:
erlaubt, wird es so eh nicht gehen, denn bei einem String kommt da nur Schrott bei raus.
Result := TSonstwas(42);
|
AW: Result im generischen Objekt vorbelegen.
Zitat:
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. |
AW: Result im generischen Objekt vorbelegen.
Zitat:
|
AW: Result im generischen Objekt vorbelegen.
Zitat:
Delphi-Quellcode:
Das Funktioniert. Sieht für mich sogar eleganter aus, als die Pointer-Geschichte. Danke.
Result := TValue(42).AsType<T>;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 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-2025 by Thomas Breitkreuz