![]() |
TObjectList<> - Frage
Ich habe eine TObjectList<TTyp1> mit einer Reihe von Prozeduren und Funktionen.
Ich würde diese Liste gern für einen TTyp2 verwenden, ohne den ganzen Code duplizieren zu müssen. Ich würde darauf achten, dass TTyp2 alle Elemente von TTyp1 enthält, auf die sich die Prozeduren und Funktionen der Objektliste (z.B. Sortieren und Suchen) beziehen. Geht sowas? Ich fürchte mal stark, mit Interfaces, insbesondere nach Lektüre ![]() |
AW: TObjectList<> - Frage
Bin nicht sicher, ob ich dein Anliegen richtig verstanden habe, aber das klingt für mich, als könntest du dafür eine generische Klasse erstellen. Den generischen Typ beschränkst du auf ein eigenes Interface, welches alle erforderlichen Operationen unterstüzt. Typ1 und Typ2 müssen dann nur noch das Interface implementieren.
Alternativ ohne Interfaces und dafür mit gemeinsamer Basisklasse. |
AW: TObjectList<> - Frage
Mensch, Zacherl, ein paar Worte und schon wird es lichter im Hirnkasten!
Mein Fehler war, dass ich versucht hatte für die Objektliste ein Interface zu implementieren, während es ja genügt, dies für die Objekte zu tun. Jetzt bekomme ich allerdings das im Beitrag auf SO angesprochene Problem, die Implementierung der Objektliste geht nur mit Klassen, nicht mit Interfaces. Ich könnte eine TList implementieren und das OwnsObjekt als zusätzliches Feld mit aufnehmen, müsste dann die Freigabe selbst übernehmen. Ginge wohl auch noch. Alternativ Basisklasse - eine Oberklasse erstellen und davon die benötigten Klassen ableiten? Hast du dafür ein kurzes Beispiel? |
AW: TObjectList<> - Frage
Ganz normale Vererbung halt:
Delphi-Quellcode:
Und die verwaltende Klasse dann entsprechend:
type
TBaseClass = class(TObject) public procedure CommonTest; end; TClass1 = class(TBaseClass) public procedure OnlyForClass1; end; TClass2 = class(TBaseClass) public procedure OnlyForClass2; end;
Delphi-Quellcode:
Innerhalb des Codes solltest du dann dank des Constraints ohne Probleme auf alle Eigenschaften von TBaseClass zugreifen könne.
type
TManagerClass<T: TBaseClass> = class(TObject) public FList: TObjectList<T>; end; |
AW: TObjectList<> - Frage
Tja, hab noch nicht soviel vererbt... :stupid:
Ist ja völlig einfach. Kleine Frage vor allem nach der Lektüre ![]() Was passiert eigentlich wenn ich Felder in der abgeleiteten Klasse wiederhole?
Delphi-Quellcode:
Nach meinen Versuchen hat das keine Auswirkungen; wenn ich nach Var1 sortiere, funktioniert das. Kann man sowas straflos tun?
type
TBasis = class(TObject) Var1 : integer; Var2 : string; end; type TErbe = class(TBasis) Var1 : integer; Var2 : string; end; type TListe = class(TObjectList<TBasis>) public procedure SortiereVar1(Wert:integer) end; |
AW: TObjectList<> - Frage
Zitat:
Delphi-Quellcode:
erstellst und dann Var1 den Wert 42 zuweist, ist
TErbe
Delphi-Quellcode:
immer noch 0. Da dies eine ziemlich häufige Fehlerquelle ist, würde ich dir davon definitiv abraten (macht auch wirklich selten Sinn). Wenn du die Felder in
TBasis.Var1
Delphi-Quellcode:
einfach weglässt, kannst du ja trotzdem auf die vererbten Felder aus
TErbe
Delphi-Quellcode:
zugreifen, auch wenn deine Instanz vom Typ
TBasis
Delphi-Quellcode:
ist.
TErbe
Delphi-Quellcode:
Bezüglich deines Beispiels würde ich dir btw. auf jeden Fall raten nicht direkt von
var
T1: TBaseClass; T2: TClass2; begin .. // Kompiliert T1.CommonTest; // Kompiliert auch T2.CommonTest; T2.OnlyForClass2; ..
Delphi-Quellcode:
abzuleiten, sondern eine dedizierte Klasse zu erstellen, welche lediglich ein Feld vom Typ
TObjectList<T>
Delphi-Quellcode:
beinhaltet. So wie in meinem Beispiel weiter oben.
TObjectList<T>
|
AW: TObjectList<> - Frage
Das verstehe ich. Hab ich jetzt auch nicht verwirklicht.
Was ist der Grund, nicht direkt von
Delphi-Quellcode:
abzuleiten? Darauf würde ich sehr ungern verzichten, da das einiges an Codeänderungen bedeuten würde. Ich brauche die abgeleitete Klasse nur in einer einzigen (größeren) Prozedur.
TObjectList
|
AW: TObjectList<> - Frage
Zitat:
|
AW: TObjectList<> - Frage
Mit Klassen geht es am Problemlosesten, vorallem die Einschränkung auf einen bestimmten Grundtypen.
Auch allgemein das Constraint auf Objectinstanzen (class) geht, auch wenn man da dann praktisch nur den Grungconstructor (parameterloses Create) und den Destructor ohne verbiegen nutzen kann. ![]() Aber sowas wie "nummerische typen", "ordinale typen", alle strings, alle chars oder sowas kann man vergessen. |
AW: TObjectList<> - Frage
Frohe Ostern!
Funktioniert alles soweit gut, eine kleine - eher kosmetische - Störung gibt es aber: Die Objektliste ist mit dem Typ TBasis konstruiert. In TBasis sind alle Felder, auf die sich die Such- und Sortierfunktionen beziehen. Wenn ich jetzt mit mit einer Instanz von TErbe arbeiten will, muss ich immer eine Typumwandlung TErbe(Objektliste[i]) vornehmen. Lässt sich das beseitigen? PS: Und noch 'ne Frage: Wenn ich das doch über ein Interface realisieren würde, dann müsste doch jede Klasse die Prozeduren und Funktionen dieses Interfaces implementieren. Was wäre denn damit gewonnen? Ich möchte doch gerade diese Prozeduren nur einmal implementieren und gemeinsam nutzen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 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