Einzelnen Beitrag anzeigen

Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.366 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Generic class <T> , wie füge ich konkrete Daten ein ?

  Alt 9. Jan 2024, 11:06
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat