Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   TList<T> erst in abgeleiteter Klasse instantiieren (https://www.delphipraxis.net/197348-tlist-t-erst-abgeleiteter-klasse-instantiieren.html)

Codehunter 1. Aug 2018 07:02

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.

DeddyH 1. Aug 2018 07:25

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;

Codehunter 1. Aug 2018 07:30

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.

DeddyH 1. Aug 2018 07:40

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:
type
  TMyDingensType = class(TMyType1<TDingens>)
? Nach meiner Denke müsste da doch dasselbe herauskommen, wenn sich Deine Idee umsetzen ließe.

Codehunter 1. Aug 2018 07:45

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.

DeddyH 1. Aug 2018 07:50

AW: TList<T> erst in abgeleiteter Klasse instantiieren
 
Achso, das ist bereits eine Ableitung, konnte ich ja nicht wissen.

Codehunter 1. Aug 2018 08:01

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.

Uwe Raabe 1. Aug 2018 08:01

AW: TList<T> erst in abgeleiteter Klasse instantiieren
 
Zitat:

Zitat von Codehunter (Beitrag 1409289)
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.

Das kannst du ja über MINENUMSIZE steuern.

Codehunter 1. Aug 2018 08:28

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:
IndexOf()
statt
Delphi-Quellcode:
Feld in Set
. Vielleicht nicht die eleganteste Lösung aber der Übersichtlichkeit halber finde ich in dem Fall besser.


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