Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi TObjectList<> - Frage (https://www.delphipraxis.net/192407-tobjectlist-frage.html)

Olli73 16. Apr 2017 11:57

AW: TObjectList<> - Frage
 
Zitat:

Zitat von Benmik (Beitrag 1367851)
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?

Wenn in TBasis alle benötigten Properties (besser als public Felder) und Methoden deklariert sind, musst du nicht casten.

Brauchst du Methoden, die es nur in einem der TErbe gibt, musst du entweder casten oder zwei Objektlisten mit dem jeweiligen TErbe erstellen.

Benmik 16. Apr 2017 13:10

AW: TObjectList<> - Frage
 
Folgende Konstruktion:
Delphi-Quellcode:
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];
Das geht nicht, weil die Liste vom Typ TBasis und nicht TErbe ist. Mit
Delphi-Quellcode:
Erbe := TErbe(Liste[0]);
geht es.

DeddyH 16. Apr 2017 13:28

AW: TObjectList<> - Frage
 
Wieso deklarierst Du die Variable als TErbe, wenn Du nur auf Felder von TBasis zugreifst?

Benmik 16. Apr 2017 13:52

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.

Zacherl 16. Apr 2017 15:28

AW: TObjectList<> - Frage
 
Ich glaube du hast da irgendwo noch einen Logikfehler. Sollte es nicht eher so sein:
Delphi-Quellcode:
type
  TListe<T: TBasis> = class(TObjectList<T>)
  public
    procedure SortiereVar1(Wert:integer)
  end;
Dann hast du nämlich keinerlei Probleme später bei den konkreten Instanzen folgendes zu machen:
Delphi-Quellcode:
var
  List1: TListe<TErbe>;
  List2: TListe<TNochEinErbe>;
  List3: TListe<TBasis>
Besonders, da du ja sagst, dass du in
Delphi-Quellcode:
TListe
eh nur Felder aus
Delphi-Quellcode:
TBasis
verwendest. Dies ist durch das Constraint sehr komfortabel möglich.

Benmik 16. Apr 2017 16:24

AW: TObjectList<> - Frage
 
Ja, irgendwie kann ich mich nicht richtig verständlich machen.
Also vielleicht nochmal. Ich habe folgende Situation:
Delphi-Quellcode:
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;
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.
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:
 Erbe := TErbe(Liste[0]) machen.
Wie gesagt, es funktioniert alles, aber ich glaube, dass das besser geht. Die Syntax von
Delphi-Quellcode:
 TListe<T: TBasis> = class(TObjectList<T>)
kannte ich nicht und kann nur mutmaßen, was dahinter steht.

DeddyH 16. Apr 2017 16:53

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.

Benmik 16. Apr 2017 17:09

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 Antwort von Zacherl), da sie ja schon in der Vorfahr-Klasse Typ1 enthalten sind.
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.

DeddyH 16. Apr 2017 17:15

AW: TObjectList<> - Frage
 
Welche Variable denn?

Olli73 16. Apr 2017 17:24

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 02:31 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz