Einzelnen Beitrag anzeigen

Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

Doppelt verkettete Liste als generischer Typ

  Alt 29. Sep 2014, 12:03
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
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks

Geändert von Schorschi5566 (29. Sep 2014 um 12:07 Uhr)
  Mit Zitat antworten Zitat