![]() |
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
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:33 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