![]() |
TList<T> erst in abgeleiteter Klasse instantiieren
Moin!
Ist es möglich, in einer Basisklasse eine generische TList undefiniert zu lassen und deren Elementtyp erst in abgeleiteten Klassen festzulegen? In etwa so:
Delphi-Quellcode:
unit Unit1;
interface uses System.Generics.Collections; type TMyType1 = class(TObject) private FListe: TList<T>; // <-- E2003: Undeklarierter Bezeichner: 'T' protected function Count: Integer; property Liste: TList<T> read FListe write FListe; end; TMyType2 = class(TMyType1) public constructor Create; end; TMyType3 = class(TMyType1) public constructor Create; end; implementation { TMyType1 } function TMyType1.Count: Integer; begin Result := FListe.Count; end; { TMyType2 } constructor TMyType2.Create; begin Liste := TList<Integer>.Create; end; { TMyType3 } constructor TMyType3.Create; begin Liste := TList<string>.Create; end; end. |
AW: TList<T> erst in abgeleiteter Klasse instantiieren
Das geht glaub ich nur, wenn die Klasse selbst generisch ist, also etwa so:
Delphi-Quellcode:
type
TMyType1<T> = class(TObject) private FListe: TList<T>; public constructor Create; virtual; destructor Destroy; override; function Count: Integer; property Liste: TList<T> read FListe write FListe; end; implementation { TMyType1<T> } function TMyType1<T>.Count: Integer; begin Result := FListe.Count; end; constructor TMyType1<T>.Create; begin inherited; FListe := TList<T>.Create; end; destructor TMyType1<T>.Destroy; begin FListe.Free; inherited; end; |
AW: TList<T> erst in abgeleiteter Klasse instantiieren
Genau das geht in meinem Fall leider nicht. Der Typ der Liste sollen Enums werden, die Klassen-lokal definiert sind, sich jedoch aufgrund ihrer Anzahl und des komlizierten Speicherhandlings nicht gut für ein set of eignen. insbesondere weil die Anzahl der Elemente in den verchiedenen Klassen-Enums unterchiedlich sind und darum in der Elternklasse schlecht ver Typcast gearbeitet werden kann. Der Compiler macht daraus nämlich je nach Anzahl Elemente ein Byte, Word oder DWord.
|
AW: TList<T> erst in abgeleiteter Klasse instantiieren
Verstehe ich ehrlich gesagt gerade nicht. Abgesehen davon, wo ist denn technisch gesehen der Unterschied zu Deinem Ansatz und etwas wie
Delphi-Quellcode:
? Nach meiner Denke müsste da doch dasselbe herauskommen, wenn sich Deine Idee umsetzen ließe.
type
TMyDingensType = class(TMyType1<TDingens>) |
AW: TList<T> erst in abgeleiteter Klasse instantiieren
TMyType1 ist ein Abkömmling von TCollectionItem, den kann ich nicht generisch deklarieren (soweit ich weiß). Die ganze Geschichte ist eine mehrdimensionale Liste.
|
AW: TList<T> erst in abgeleiteter Klasse instantiieren
Achso, das ist bereits eine Ableitung, konnte ich ja nicht wissen.
|
AW: TList<T> erst in abgeleiteter Klasse instantiieren
Ich denke ich habs jetzt viel einfacher gelöst. Da es sich beim Inhalt der Liste eigentlich um Enums-Items handelt, habe ich es einfach als TList<Word> deklariert (65535 mögliche Einträge im Enum sollten erstmal reichen ^^) und erschlage den Rest einfach per Typecast in den Kindklassen.
|
AW: TList<T> erst in abgeleiteter Klasse instantiieren
Zitat:
![]() |
AW: TList<T> erst in abgeleiteter Klasse instantiieren
Jain. Das Thema hatten wir ja
![]()
Delphi-Quellcode:
statt
IndexOf()
Delphi-Quellcode:
. Vielleicht nicht die eleganteste Lösung aber der Übersichtlichkeit halber finde ich in dem Fall besser.
Feld in Set
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:07 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-2025 by Thomas Breitkreuz