![]() |
Verkette Liste mit unbekannten Objekten?
Tag,
ich habe vor eine klasse(in einer extra unit) zu schreiben (TLinkedList)... ich möchte dann eine instanz dieser klasse erzeugen und dabei die klasse um die sich die liste handelt übergeben...wie geht das? geht das überhaupt? also sowas wie:
Delphi-Quellcode:
?
PLinkedList = ^TUnbekanntesObjekt
var1: string; var2: string; var3: string; end; |
Re: Verkette Liste mit unbekannten Objekten?
Hallo,
es hört sich so an als ob das Gespann TCollection/TCollectionItem erfinden möchtest. |
Re: Verkette Liste mit unbekannten Objekten?
Zitat:
|
Re: Verkette Liste mit unbekannten Objekten?
ja tut es, und da ich meine dynamischen arrays gerade durch verkettete listen ersetze...
das problem ist das ich für jeden record(geht das gleiche überhaupt mit klassen?) eine neue klasse schreiben muss, weil das item der verketteten liste jedes mal ein anderes ist |
Re: Verkette Liste mit unbekannten Objekten?
Hallo,
ich glaube polymorphe Funktionen gehen mit Delphi nicht. Wozu brauchst du das aber überhaupt, die TLinkedList soll ja nichts mit den gespeicherten Daten anfangen? Dann nimm doch einen allgemeineren Typen, also z.B. ein TObject wenn nur Klassen zugelassen werden sollen oder einfach nur ein Pointer. |
Re: Verkette Liste mit unbekannten Objekten?
Zitat:
|
Re: Verkette Liste mit unbekannten Objekten?
irgendwie krieg ich den dreh nicht raus wie ich VERSCHIEDENE objekte in so eine liste bekomme.
wenn es um eine liste EINES typs ging hab ich das immer so gemacht:
Delphi-Quellcode:
PMyList = ^TMyList;
TMyList = record blah1: string; end; nur was nehme ich statt ^TMyList wenn ich eben verschiedene objekte übergeben möchte? |
Re: Verkette Liste mit unbekannten Objekten?
Wenn du es objektorientiert machst, dann brauchst du einfach eine Basisklasse, von der alle anderen Klassen abgeleitet sind.
Ein kleines Beispiel: Du willst Daten über CD/DVDs verschiendener Arten (Musik, Video, Bilder) speichern:
Delphi-Quellcode:
type
TListEntry = class end; TListNode = class private Data: TListEntry; Next: TListNode; end; TAudioDisc = class(TListEntry) //hier Klassen-Interface end; TVideoDisc = class(TListEntry) //hier Klassen-Interface end; TImageDisc= class(TListEntry) //hier Klassen-Interface end; var ln: TListNode; begin //... ln.Data := TImageDisc.Create; Nun kannst du alles, was vn TListEntry abgeleitet ist, dranhängen. |
Re: Verkette Liste mit unbekannten Objekten?
moin chewie,
danke für dein beispiel, wenn folgendes nicht möglich ist werd ich es so machen ;) 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? |
Re: Verkette Liste mit unbekannten Objekten?
OK, wenn du das mit Records machen willst geht das auch. Du musst dann deine "Nutzlast" als Zeiger auf ein Record definieren. Entweder untypisiert oder, analog zu der OOP-Variante, einen Record mit varablem Anteil anlegen.
Ich würde dir aber schwer zu der OOP-Variante raten. Dort sparst du dir u.U. die ewigen Typabfragen, indem du ![]() |
Re: Verkette Liste mit unbekannten Objekten?
Zitat:
kannst du mir sagen wie? :oops: also:
Delphi-Quellcode:
geht nicht :oops:
irgendwas = ^record;
|
Re: Verkette Liste mit unbekannten Objekten?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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:
Die Inspiriration für diesen Direktivenkrieg kam von maximov und seiner Template Version der dpCollection.
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. 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. :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 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-2025 by Thomas Breitkreuz