![]() |
TList / Generics vererben
Hi,
lassen sich Generics "vererben"? Also vom Typ:
Delphi-Quellcode:
Geht so etwas?
type
TFarbe = class end; type TRot = class(TFarbe) end; type TBlau = class(TFarbe) end; procedure CleanColor; var varListRed: TList<TRot>; varListBlue: TList<TBlau>; varListToEdit: ??? begin if (...) then varListToEdit := varListRed else varListToEdit := varListBlue; (...) varListToEdit.DoSomething; varListToEdit.TrimExcess end; (Alternativ bräuchte ich nur Standardfunktionen, die alle TList, unabhängig von der Typisierung haben, also z.B. TrimExccess). Viele Grüße, Martin |
AW: TList / Generics vererben
Das grundlegende Problem hab ich
![]() In deinem Fall kannst du mit einem Hardcast arbeiten sofern du nicht versuchst nen TRot in ne liste von TBlau zu stecken:
Delphi-Quellcode:
procedure CleanColor;
var varListRed: TList<TRot>; varListBlue: TList<TBlau>; varListToEdit: TList<TFarbe>; begin if (...) then varListToEdit := TList<TFarbe>(varListRed); else varListToEdit := TList<TFarbe>(varListBlue); (...) varListToEdit.DoSomething; varListToEdit.TrimExcess end; |
AW: TList / Generics vererben
Geht das nicht in Delphi?
Delphi-Quellcode:
Procedure Foo<T> (A : TList<T:TFarbe>);
begin A.DoSomething; A.Bar; End; ... if this then Foo<TRot>(varListRed) else Foo<TBlau>(varListBlue); |
AW: TList / Generics vererben
Nicht ganz, denn es muss eine Methode sein.
Delphi-Quellcode:
TFoo = class
class procedure Bar<T>( List : TList<T> ); end; class procedure TFoo.Bar<T>( List : TList<T> ); begin List.TrimExcess; end; |
AW: TList / Generics vererben
Die Routine bringt aber nix, wenn sie generisch ist, kannste sie nicht unter das if/else schreiben und für jegliche TList<T> nutzen, weil du immernoch nen T angeben musst. Die fehlende Kontravarianz ist hier das Problem.
Sonst hättse ja gleich das hier schreiben können, nech?
Delphi-Quellcode:
if (...) then
varListRed.TrimExcess else varListBlue.TrimExcess; |
AW: TList / Generics vererben
Zitat:
Aber im Prinzip verstehe ich deinen Einwand. Ganz so einfach, wie man das gerne hätte, wird es natürlich nicht. Dazu muss man den generischen Ansatz durchziehen. Oder ich nehme Reflection, oder wie das bei Delphi heißt (RTTI oder so) und mache es so: 1. Das T der TList<T> ermitteln. 2. Per RTTI die Methode mit dem Typparameter und der Liste aufrufen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:25 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 by Thomas Breitkreuz