AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Doppelt verkettete Liste als generischer Typ
Thema durchsuchen
Ansicht
Themen-Optionen

Doppelt verkettete Liste als generischer Typ

Ein Thema von Schorschi5566 · begonnen am 29. Sep 2014 · letzter Beitrag vom 29. Sep 2014
 
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, 13: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 13:07 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:31 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