![]() |
Doppelt verkettete Liste als generischer Typ
Hallo DP,
ich habe eine doppelt verkettete Liste als einfache Basis-Klasse TChainList:
Delphi-Quellcode:
Verwendet wird sie dann beispielsweise so:
type
TChainList = class(TPersistent) private FDeleting: Boolean; FEol: Boolean; FPredecessor: TChainList; FSuccessor: TChainList; function GetEol: Boolean; procedure SetDeleting(const Value: Boolean); property Deleting: Boolean read FDeleting write SetDeleting; public destructor Destroy; override; procedure Add(Item: TChainList); virtual; function Delete: TChainList; function Last: TChainList; function First: TChainList; function Next: TChainList; function Previous: TChainList; property Eol: Boolean read GetEol; end;
Delphi-Quellcode:
Ich möchte das Ganze ohne die Casts haben und dachte an eine generische Liste. Allerdings meckert er immer, dass T einen public parameterlosen Konstruktur braucht. Aber das tut er auch, wenn ich der abgeleiteten Klasse einen gebe.
type
TTestClass = class(TChainList) private FData: string; public function Add(Text: string): TTestClass; overload; property Data: string read FData write FData; end; . . . procedure TForm1.Test; var Chain: TTestClass; begin Chain := TTestClass.Create; try Chain.Data := 'Test1'; Chain.Add('Test2'); Chain.Add('Test3'); Chain.Add('Test4'); Chain := Chain.First as TTestClass; // blöder Cast while not Chain.Eol do begin // do something Chain := Chain.Next as TTestClass; // blöder Cast end; finally Chain.Free; end; end; Probiert habe ich die Basisklasse auf TChainList<T: class, constructor> = class umzuschreiben. Eine Deklaration mit
Delphi-Quellcode:
geht dann aber mit obigem Compilerfehler schief.
type
TTestClass = class(TChainList<TTestClass>) // wohl etwas zu gewagter Rückbezug auf sich selbst... private FData: string; public function Add(Text: string): TTestClass; overload; property Data: string read FData write FData; end; Geht das überhaupt? Oder geht es wenigstens auf andere Art? Viele Grüße, Uwe |
AW: Doppelt verkettete Liste als generischer Typ
Du wirfst hier Einträge und Listen durcheinnander.
Der Vorgänger/Nachfolger sind keine Listen sondern Elemente |
AW: Doppelt verkettete Liste als generischer Typ
Hallo Mkinzler,
mit Einträgen und Listen ist's ja kein Problem. :stupid: Das soll schon so sein, dass einem Eintrag auf diese Weise seine eigene Liste bekannt wird. Viele Grüße, Uwe |
AW: Doppelt verkettete Liste als generischer Typ
Und was wird z.B. hier zurückgegeben?
Zitat:
|
AW: Doppelt verkettete Liste als generischer Typ
Hallo DeddyH,
na es wird das letzte Element der verketteten Liste zurückgegeben.
Delphi-Quellcode:
Der Witz ist ja gerade, dass man nicht Liste und Elemente verwalten muss sondern nur die Elemente. Finde ich eigentlich ganz elegant, wenn die Casts nicht wären.
function TChainList.Last: TChainList;
begin Result := Self; if Self <> nil then begin while Result.FSuccessor <> nil do Result := Result.FSuccessor; FEol := False; end; end; |
AW: Doppelt verkettete Liste als generischer Typ
Bei einer generischen Liste entfällt der Cast.
|
AW: Doppelt verkettete Liste als generischer Typ
Diese Vorgehensweise ist mir neu. Ich hätte da eher einen Elementtyp deklariert und die Listenklasse, die einem die Verwaltung und Navigation abnimmt.
|
AW: Doppelt verkettete Liste als generischer Typ
Zitat:
|
AW: Doppelt verkettete Liste als generischer Typ
Zitat:
Es geht mir nicht um den klassischen Ansatz mit Elementen und einer Liste, die die Elemente verwaltet. Das ist über TList<T> oder Ähnliches keine Sache. Ich möchte den Elementen über ihre Basisklasse gleich die Listenverwaltung mitgeben. Das funktioniert ja auch. Lediglich die Casts stören mich bei diesem Ansatz und meine Frage war ob jemand weiß ob man das mit Generics lösen könnte und wie. |
AW: Doppelt verkettete Liste als generischer Typ
|
AW: Doppelt verkettete Liste als generischer Typ
Ich glaube du vermischst hier Daten und die Listen-Items. Falls ich dich richtig verstehe würde es meiner Meinung nach so aussehen:
Delphi-Quellcode:
type
TChainList<T> = class(TPersistent) private FData:T; FDeleting: Boolean; FEol: Boolean; FPredecessor: TChainList; FSuccessor: TChainList; function GetEol: Boolean; procedure SetDeleting(const Value: Boolean); property Deleting: Boolean read FDeleting write SetDeleting; public destructor Destroy; override; procedure Add(Item: T); function Delete: TChainList; function Last: TChainList; function First: TChainList; function Next: TChainList; function Previous: TChainList; property Eol: Boolean read GetEol; property Data: T read FData write FData; end; TTestClass = class(TChainList<string>) end; |
AW: Doppelt verkettete Liste als generischer Typ
Was hältst Du von diesem Ansatz?
Delphi-Quellcode:
Und wenn Du unbedingt willst, kannst Du die Listenklasse weglassen und alles in der Element-Klasse implementieren.
type
TChainElement<T> = class private FData: T; FNext: TChainElement<T>; FPrior: TChainElement<T>; public property Data: T read FData write FData; property Next: TChainElement<T> read FNext write FNext; property Prior: TChainElement<T> read FPrior write FPrior; end; TChain<T> = class private FFirstElement: TChainElement<T>; FLastElement: TChainElement<T>; FCurrentElement: TChainElement<T>; function GetNext: TChainElement<T>; function GetPrior: TChainElement<T>; function GetBOF: Boolean; function GetEOF: Boolean; function GetFirst: TChainElement<T>; function GetLast: TChainElement<T>; public function Add: TChainElement<T>; procedure Delete(Item: TChainElement<T>); procedure Clear; property BOF: Boolean read GetBOF; property EOF: Boolean read GetEOF; property First: TChainElement<T> read GetFirst; property Last: TChainElement<T> read GetLast; property Next: TChainElement<T> read GetNext; property Prior: TChainElement<T> read GetPrior; end; [edit] Na toll, da tippe ich mir einen ab und andere sind wieder schneller. [/edit] |
AW: Doppelt verkettete Liste als generischer Typ
Zitat:
Grüße, Uwe |
AW: Doppelt verkettete Liste als generischer Typ
In Spring4D gibt's auch
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 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