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.