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 letztens auch schon mal. Letztlich ist im konkreten Fall die Lösung über eine TList handhabbarer, weil ich dann intern auch nicht so viel umkopieren muss um verschiedene Sets zu vergleichen. So caste ich das einmal auf einen Word, packs in die Liste und prüfe dann mit
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 18:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz