![]() |
AW: TObjectList<> - Frage
Zitat:
Brauchst du Methoden, die es nur in einem der TErbe gibt, musst du entweder casten oder zwei Objektlisten mit dem jeweiligen TErbe erstellen. |
AW: TObjectList<> - Frage
Folgende Konstruktion:
Delphi-Quellcode:
Das geht nicht, weil die Liste vom Typ TBasis und nicht TErbe ist. Mit
type
TBasis = class(TObject) Var1 : integer; Var2 : string; end; type TErbe = class(TBasis) Var3 : integer; Var4 : string; end; type TListe = class(TObjectList<TBasis>) public procedure SortiereVar1(Wert:integer) end; var Erbe:TErbe; Liste:TListe; Erbe := Liste[0];
Delphi-Quellcode:
geht es.
Erbe := TErbe(Liste[0]);
|
AW: TObjectList<> - Frage
Wieso deklarierst Du die Variable als TErbe, wenn Du nur auf Felder von TBasis zugreifst?
|
AW: TObjectList<> - Frage
TErbe hat gegenüber TBasis zusätzliche Felder, die ich benötige. Alle Felder, auf die die Prozeduren und Funktionen von TListe zugreifen, sind aber in TBasis enthalten. Sie werden auch für TErbe benötigt.
|
AW: TObjectList<> - Frage
Ich glaube du hast da irgendwo noch einen Logikfehler. Sollte es nicht eher so sein:
Delphi-Quellcode:
Dann hast du nämlich keinerlei Probleme später bei den konkreten Instanzen folgendes zu machen:
type
TListe<T: TBasis> = class(TObjectList<T>) public procedure SortiereVar1(Wert:integer) end;
Delphi-Quellcode:
Besonders, da du ja sagst, dass du in
var
List1: TListe<TErbe>; List2: TListe<TNochEinErbe>; List3: TListe<TBasis>
Delphi-Quellcode:
eh nur Felder aus
TListe
Delphi-Quellcode:
verwendest. Dies ist durch das Constraint sehr komfortabel möglich.
TBasis
|
AW: TObjectList<> - Frage
Ja, irgendwie kann ich mich nicht richtig verständlich machen.
Also vielleicht nochmal. Ich habe folgende Situation:
Delphi-Quellcode:
Ich brauche nun für eine bestimmte Aufgabe Var1 und Var2 und die dazugehörigen Prozeduren der TObjectlist, aber zusätzlich noch Var5 und Var6. Var5..20 brauche ich nicht. Das alles ist nun in Typ2 realisiert.
type
TTyp = class(TObject) Var1 : integer; Var2 : string; Var3 : Boolean; Var4 : TBitmap; Var5..Var20 end; type TTyp2 = class(TBasis) Var1 : integer; Var2 : string; Var5 : integer; Var6 : string; end; type TListe = class(TObjectList<TTyp1>) public procedure SortiereVar1(Wert:integer) procedure SortiereVar2(Wert:string end; Zurzeit ist Typ2 eine abgeleitete Klasse von Typ1. Damit stehen mir die neuen Felder und die gewünschten Prozeduren der TObjectList zur Verfügung, aber ich schleppe Var5..Var20 mit und muss immer den Typecast
Delphi-Quellcode:
Wie gesagt, es funktioniert alles, aber ich glaube, dass das besser geht. Die Syntax von
Erbe := TErbe(Liste[0]) machen.
Delphi-Quellcode:
kannte ich nicht und kann nur mutmaßen, was dahinter steht.
TListe<T: TBasis> = class(TObjectList<T>)
|
AW: TObjectList<> - Frage
Irgendwie sieht Dein Klassenmodell komisch aus. Sind die Variablen bzw. Felder wirklich in den Ableitungen redeklariert? Wenn ja, wieso? Wenn Deine Objektliste nur auf Felder und Methoden zugreift, die bereits in der Basisklasse deklariert wurden, ist der Typecast unnötig.
|
AW: TObjectList<> - Frage
Nein, nein, die Var1 und Var2 wurden bei Typ2 nur zur Verdeutlichung aufgeführt, dass eine Schnittmenge zum Typ1 besteht; in der wirklichen Deklaration fehlen sie natürlich (siehe auch meine Frage und die
![]() Dass meine Konstruktion nicht optimal ist, will ich gern glauben. Im Moment sieht es so aus:
Delphi-Quellcode:
type Typ1<TObject>
Delphi-Quellcode:
type Typ2 = class(Typ1)
Delphi-Quellcode:
.
type Liste = TObjectlist<Typ1>
Ohne Typecast geht es damit nicht, weil der Compiler meckert, die Liste wär vom Typ1 und die Variable vom Typ2. |
AW: TObjectList<> - Frage
Welche Variable denn?
|
AW: TObjectList<> - Frage
Sollen in "Liste" Objektinstanzen von Typ1 und Typ2 gespeichert werden oder genügt es dir eine Liste1 vom Typ1 und eine Liste2 vom Typ2 zu haben?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:51 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