Hallo
DP,
ich habe eine doppelt verkettete Liste als einfache Basis-Klasse TChainList:
Delphi-Quellcode:
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;
Verwendet wird sie dann beispielsweise so:
Delphi-Quellcode:
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;
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.
Probiert habe ich die Basisklasse auf TChainList<T: class, constructor> = class umzuschreiben.
Eine Deklaration mit
Delphi-Quellcode:
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 dann aber mit obigem Compilerfehler schief.
Geht das überhaupt? Oder geht es wenigstens auf andere Art?
Viele Grüße,
Uwe