Versuch es mal so:
Delphi-Quellcode:
type
TVariable = class
end;
TVariable<T> = class(TVariable)
private
FVar: T;
public
constructor Create(Init: T);
end;
Zu dumm nur, dass man mit einem TVariable nicht an den typisierten Value kommt.
Leute, versucht doch nicht immer alle Probleme mit Generics zu erschlagen, wo Generics überhaupt keinen Sinn machen.
Polymorphie und Generics passen nunmal nicht zusammen.
Bei Generics lege ich zur Compiletime fest, welchen Typ ich haben will und nicht zur Laufzeit.
Da würde ich fragen, warum lege ich die Typen der Variablen nicht gleich auf string, Integer und TKlasse fest.
Zum Transport von Werten, wo man zur Compilezeit noch nicht weiß, was dort reinkommt, gibt es
TValue. Aber auch dort muss man wieder das herausholen, was man reingepackt hat (
AsType<T>
).
Delphi-Quellcode:
var
var1, var2, var3: TValue;
begin
var1 := 'Hello World';
var2 := 42;
var3 := myObj;
ShowMessage(var1.AsString);
ShowMessage(IntToStr(var2.AsInteger); // Alternativ: var2.ToString
ShowMessage(var3.AsType<TKlasse>.Message);
end;
Bitte dran denken: TValue ist strikt, was Typen angeht, hier findet keine Konvertierung von Typen statt, die nicht direkt zuweisungskompatibel sind (also wenn du z.B. einen Integer rein packst, dann wirft AsString eine
Exception). ToString hingegen kann einige Typen zu einem String konvertieren.