Einzelnen Beitrag anzeigen

Robert_G
(Gast)

n/a Beiträge
 
#12

Re: Verkette Liste mit unbekannten Objekten?

  Alt 5. Dez 2004, 22:01
Zitat von Pseudemys Nelsoni:
eigentlich habe ich mir das so gedacht, das ich die klasse TLinkedList einmal(!) schreibe und dann niemehr was daran aendern muss, d.h ich kann sie immer in meinen programmen verwenden, egal für welche objekte...

ich dachte mir das dann ca so in meinem hauptprogramm:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    MyList: TLinkedList // meine klasse
  public
    procedure irgendeineprozedur;
  end;

...

procedure TForm1.irgendeineprozedur;
begin
  MyList.AddItem(instanzIRGENDEINERklasse); //additem = methode von TLinkedList
end;

weisst wie ich meine?
Wie wäre es mit einer Pseudo-generic Liste?
Delphi-Quellcode:
unit TestStringTypes;
interface
   {$DEFINE TYPED_LIST_TEMPLATE}
   type _LIST_DATA_TYPE_ = string;
   {$INCLUDE TypedLinkedList_template.pas}
   type TStringList = _TYPED_LIST_;
   type TStringNode = _TYPED_LIST_NODE_;
implementation
   {$INCLUDE TypedLinkedList_template.pas}
end.
Delphi-Quellcode:
unit TestIntegerTypes;
interface
   {$DEFINE TYPED_LIST_TEMPLATE}
   type _LIST_DATA_TYPE_ = Integer;
   {$INCLUDE TypedLinkedList_template.pas}
   type TIntegerList = _TYPED_LIST_;
   type TIntegerNode = _TYPED_LIST_NODE_;
implementation
   {$INCLUDE TypedLinkedList_template.pas}
end.
Delphi-Quellcode:
program TestApplication;

{$APPTYPE CONSOLE}

uses
   TestStringTypes in 'TestStringTypes.pas',
   TestIntegerTypes in 'TestIntegerTypes.pas';

var
   IntegerNode : TIntegerNode;
   StringNode : TStringNode;

   IntegerList : TIntegerList;
   StringList : TStringList;

   i : Integer;
begin
   IntegerList := TIntegerList.Create();
   StringList := TStringList.Create();

   for i := 1 to 10 do
      IntegerList.AddData(i);

   // Zum Testen entfernen wird der vorletzte Eintrag entfernt
   with IntegerList do
      Delete(Previous(Tail));

   StringList.AddData('a');
   StringList.AddData('b');
   StringList.AddData('c');
   StringList.AddData('d');
   StringList.AddData('e');

   // Zum Testen entfernen wird der zweite Eintrag entfernt
   with StringList do
      Delete(Next(Head));

   // Ausgabe
   for IntegerNode in IntegerList do
      Writeln(IntegerNode.Data);

   for StringNode in StringList do
      Writeln(StringNode.Data);

   Sleep(3000);
end.
Die Inspiriration für diesen Direktivenkrieg kam von maximov und seiner Template Version der dpCollection.

Das dumme daran ist, dass ich zur Compile zeit nicht unterscheiden kann, ob Data ein Klassenobjekt oder ein primitives Objekt enthält um daraufhin ein Säubern im Destructor auszulösen.
Deshalb habe ich vorerst das Zerstören von Data jedes Knotens rausgenommen. Vielleicht fällt mir morgen etwas dazu ein. Nur primitiver Typen wären schon sehr doof.
Und Extra units á la TypedList_of_ClassTypes und TypedList_of_primitiveTypes wären auch doof.
Angehängte Dateien
Dateityp: zip typedlinkedlist.zip (6,8 KB, 13x aufgerufen)
  Mit Zitat antworten Zitat