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
Antwort Antwort
Seite 1 von 2  1 2      
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
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Doppelt verkettete Liste als generischer Typ

  Alt 29. Sep 2014, 12:06
Du wirfst hier Einträge und Listen durcheinnander.
Der Vorgänger/Nachfolger sind keine Listen sondern Elemente
Markus Kinzler
  Mit Zitat antworten Zitat
Schorschi5566

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

AW: Doppelt verkettete Liste als generischer Typ

  Alt 29. Sep 2014, 12:11
Hallo Mkinzler,

mit Einträgen und Listen ist's ja kein Problem.
Das soll schon so sein, dass einem Eintrag auf diese Weise seine eigene Liste bekannt wird.


Viele Grüße,
Uwe
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Doppelt verkettete Liste als generischer Typ

  Alt 29. Sep 2014, 12:15
Und was wird z.B. hier zurückgegeben?
Zitat:
function Last: TChainList;
Ich hätte ja auch gedacht, dass es da einen Typ TChainItem oder so gibt, der im Grunde lediglich ein Pointer ist.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Schorschi5566

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

AW: Doppelt verkettete Liste als generischer Typ

  Alt 29. Sep 2014, 12:22
Hallo DeddyH,

na es wird das letzte Element der verketteten Liste zurückgegeben.
Delphi-Quellcode:
function TChainList.Last: TChainList;
begin
  Result := Self;
  if Self <> nil then
  begin
    while Result.FSuccessor <> nil do
      Result := Result.FSuccessor;
    FEol := False;
  end;
end;
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.
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Doppelt verkettete Liste als generischer Typ

  Alt 29. Sep 2014, 12:33
Bei einer generischen Liste entfällt der Cast.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Doppelt verkettete Liste als generischer Typ

  Alt 29. Sep 2014, 12:33
Diese Vorgehensweise ist mir neu. Ich hätte da eher einen Elementtyp deklariert und die Listenklasse, die einem die Verwaltung und Navigation abnimmt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Doppelt verkettete Liste als generischer Typ

  Alt 29. Sep 2014, 12:34
Diese Vorgehensweise ist mir neu. Ich hätte da eher einen Elementtyp deklariert und die Listenklasse, die einem die Verwaltung und Navigation abnimmt.
Ich auch.
Markus Kinzler
  Mit Zitat antworten Zitat
Schorschi5566

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

AW: Doppelt verkettete Liste als generischer Typ

  Alt 29. Sep 2014, 12:49
Bei einer generischen Liste entfällt der Cast.
Wenn Du mir jetzt noch sagst, wie man das deklariert, wäre meine Frage beantwortet.

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.
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Doppelt verkettete Liste als generischer Typ

  Alt 29. Sep 2014, 13:03
https://delphihaven.wordpress.com/category/generics/
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz