@BUG und stahli:
Doch, in dem Fall ist TTruck<TStandardPacket> von TCar abgeleitet und man kann auch ganz normal auf alle TCar Methoden/Properties zugreifen.
TList<T> ist nur deshalb kein Nachfahre von TList, weils einfach nicht davon abgeleitet ist, sondern von TEnumerable<T> (und das von TObject)
In Delphi geht es nunmal nicht so einfach, dass man einen generischen Typen von einem nicht generischen Typen ableitet, da Delphi nunmal keinen root type hat. Man kann es nachbilden bis zu einem gewissen Grad, aber was machst du, wenn du ne TList<IMyInterface> hast und das als TList übergibst, wo jedes Element nur nen Pointer ist? Was ist mit der Referenzzählung? Was passiert bei anderen Datentypen... etc
@Himitsu:
Das nennt man Covarianz (die in Delphi fehlt) und ich glaube, das hab ich auch im "Wünsch dir was" Thread aufgeführt
Was du vor hast, klingt nett, hat aber nix mit Generics zu tun, wie sie allgemein funktionieren. Ein Typenparameter steuert niemals die Vererbungshierarchie.
TFoo<TButton> wäre covariant zu TFoo<TWinControl> (du kannst in diesem Fall ohne Probleme nen hardcast machen und alles funktioniert weiterhin)
Wäre die Definition aber TFoo<T> = class(T) dann wäre der Vorgänger von TFoo<TButton> nämlich TButton von TFoo<TWinControl> wäre es TWinControl, womit die beiden generischen Typen nicht mehr covariant wären.
Was du willst, sind Extensions wie es sie in .Net gibt.
Sowas geht ja eben auch nicht, da TMyGen<> kein Nachfahre von TEdit ist, obwohl man das glauben könnte.
Delphi-Quellcode:
type
TMyGen<T> = class(TEdit)
end;
Stimmt nicht, obiger Code ist völlig in Ordnung.
Zu dem anderen Beispiel, warum nicht das?
Delphi-Quellcode:
type
TMyGen<T: TCustomEdit> = class(TCustomEdit)
protected
function GetText: String; override;
end;
Um das Thema zu vertiefen, würd ich dazu raten, einen seperaten Thread zu eröffnen.
@Luckie:
Mich nervt es, wen manche Entwickler immer direkt losprogrammieren, ohne zu recherchieren, ob es diese Funktionalität in irgendeiner Funktion oder
Unit schon gibt und für alles das
Rad x-mal neu erfunden wird, weil man entweder zu blöd oder zu faul zum suchen ist.