Delphi-PRAXiS
Seite 1 von 3  1 23      

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)

Benmik 15. Apr 2017 17:29

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 dieses Beitrages. Zum einen benötige ich aber OwnsObjects und zum anderen gelingt es mir nicht, eine Liste zu bauen, der ich dann ein Interface zuordnen könnte, das wiederum verschiedene Objektklassen aufnehmen könnte. Oder ist der Ansatz verkehrt oder geht es anders?

Zacherl 15. Apr 2017 17:46

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.

Benmik 15. Apr 2017 18:22

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?

Zacherl 15. Apr 2017 18:49

AW: TObjectList<> - Frage
 
Ganz normale Vererbung halt:
Delphi-Quellcode:
type
  TBaseClass = class(TObject)
  public
    procedure CommonTest;
  end;

  TClass1 = class(TBaseClass)
  public
    procedure OnlyForClass1;
  end;

  TClass2 = class(TBaseClass)
  public
    procedure OnlyForClass2;
  end;
Und die verwaltende Klasse dann entsprechend:
Delphi-Quellcode:
type
  TManagerClass<T: TBaseClass> = class(TObject)
  public
    FList: TObjectList<T>;
  end;
Innerhalb des Codes solltest du dann dank des Constraints ohne Probleme auf alle Eigenschaften von TBaseClass zugreifen könne.

Benmik 15. Apr 2017 19:53

AW: TObjectList<> - Frage
 
Tja, hab noch nicht soviel vererbt... :stupid:

Ist ja völlig einfach. Kleine Frage vor allem nach der Lektüre dieses Beitrags:
Was passiert eigentlich wenn ich Felder in der abgeleiteten Klasse wiederhole?
Delphi-Quellcode:
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;
Nach meinen Versuchen hat das keine Auswirkungen; wenn ich nach Var1 sortiere, funktioniert das. Kann man sowas straflos tun?

Zacherl 15. Apr 2017 20:57

AW: TObjectList<> - Frage
 
Zitat:

Zitat von Benmik (Beitrag 1367819)
Was passiert eigentlich wenn ich Felder in der abgeleiteten Klasse wiederhole?

Die Felder werden verdeckt. Wenn du also z.b. eine Instanz von
Delphi-Quellcode:
TErbe
erstellst und dann Var1 den Wert 42 zuweist, ist
Delphi-Quellcode:
TBasis.Var1
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
Delphi-Quellcode:
TErbe
einfach weglässt, kannst du ja trotzdem auf die vererbten Felder aus
Delphi-Quellcode:
TBasis
zugreifen, auch wenn deine Instanz vom Typ
Delphi-Quellcode:
TErbe
ist.
Delphi-Quellcode:
var
  T1: TBaseClass;
  T2: TClass2;
begin
  ..
  // Kompiliert
  T1.CommonTest;
  // Kompiliert auch
  T2.CommonTest;
  T2.OnlyForClass2;
  ..
Bezüglich deines Beispiels würde ich dir btw. auf jeden Fall raten nicht direkt von
Delphi-Quellcode:
TObjectList<T>
abzuleiten, sondern eine dedizierte Klasse zu erstellen, welche lediglich ein Feld vom Typ
Delphi-Quellcode:
TObjectList<T>
beinhaltet. So wie in meinem Beispiel weiter oben.

Benmik 15. Apr 2017 21:12

AW: TObjectList<> - Frage
 
Das verstehe ich. Hab ich jetzt auch nicht verwirklicht.

Was ist der Grund, nicht direkt von
Delphi-Quellcode:
TObjectList
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.

Zacherl 16. Apr 2017 02:14

AW: TObjectList<> - Frage
 
Zitat:

Zitat von Benmik (Beitrag 1367833)
Was ist der Grund, nicht direkt von
Delphi-Quellcode:
TObjectList
abzuleiten?

Dachte ursprünglich, dass man dann das Constraint auf TBaseClass nicht anwenden kann, aber scheint zu funktionieren, also spricht nichts mehr dagegen :stupid:

himitsu 16. Apr 2017 05:48

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.
http://docwiki.embarcadero.com/RADSt...isierte_Typen)

Aber sowas wie "nummerische typen", "ordinale typen", alle strings, alle chars oder sowas kann man vergessen.

Benmik 16. Apr 2017 10:28

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 05:49 Uhr.
Seite 1 von 3  1 23      

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