Wenn du mit T in der generischen Klasse etwas machen willst, dann muss T so beschrieben sein, dass diese Aktionen dort möglich sind.
[...]
Bei Records <T: record>
ist das wegen der fehlenden Vererbung halt etwas eingeschränkt.
Eine mögliche Lösung sind hier Eventhandler, die diese Aktion durchführen. Dann muss man diese bei der Erstellung der Klasse zuweisen und kann dann in der Klasse diese aufrufen, um mit dem Typ eine Aktion durchzuführen, die man ansonsten nicht machen könnte.
Beispiel:
Delphi-Quellcode:
TBlub<T> = class
public
type
TOnCalcChecksum = function(AValue: T): Integer;
var
FValues: TDictionary<Integer, T>;
FOnCalcChecksum: TOnCalcChecksum;
public
procedure Add(AValue: T);
property OnCalcChecksum: TOnCalcChecksum read FOnCalcChecksum write FOnCalcChecksum;
...
procedure TBlub<T>.Add(AValue: T);
begin
FValues.Add(FOnGetChecksum(AValue), AValue);
end;
Das ist ein ganz banales Beispiel und vielleicht löst das hier auch das Problem nicht. Ich habe aber leider aktuell nicht die Zeit, die Logik genau anzuschauen. Uwe hat ja schon geschrieben, dass Generics nicht immer die Lösung sind. Man muss sich als erstes klarmachen, welche Funktionalität die einzelnen Typen gemeinsam haben und ob man das generisch zusammenfassen kann. Ich habe auch schon sehr komplizierte generische Funktionalitäten umgesetzt, die sehr viel Quelltext zusammengefasst haben, so dass sich der Aufwand gelohnt hat. Da musste ich aber auch mit solchen Callbacks und 4 generischen Parametern arbeiten, so dass das ganze nicht mal eben gemacht war und für manche auch nicht so gut verständlich ist. Da muss man dann genau schauen, ob Generics dort ein Vorteil sind, auch wenn man es generisch hinbekommt.