AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TObjectList<> - Frage

Ein Thema von Benmik · begonnen am 15. Apr 2017 · letzter Beitrag vom 16. Apr 2017
Antwort Antwort
Seite 1 von 3  1 23      
Benmik

Registriert seit: 11. Apr 2009
557 Beiträge
 
Delphi 12 Athens
 
#1

TObjectList<> - Frage

  Alt 15. Apr 2017, 18:29
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?
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: TObjectList<> - Frage

  Alt 15. Apr 2017, 18:46
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
557 Beiträge
 
Delphi 12 Athens
 
#3

AW: TObjectList<> - Frage

  Alt 15. Apr 2017, 19:22
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?
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: TObjectList<> - Frage

  Alt 15. Apr 2017, 19:49
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
557 Beiträge
 
Delphi 12 Athens
 
#5

AW: TObjectList<> - Frage

  Alt 15. Apr 2017, 20:53
Tja, hab noch nicht soviel vererbt...

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?
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: TObjectList<> - Frage

  Alt 15. Apr 2017, 21:57
Was passiert eigentlich wenn ich Felder in der abgeleiteten Klasse wiederhole?
Die Felder werden verdeckt. Wenn du also z.b. eine Instanz von TErbe erstellst und dann Var1 den Wert 42 zuweist, ist 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 TErbe einfach weglässt, kannst du ja trotzdem auf die vererbten Felder aus TBasis zugreifen, auch wenn deine Instanz vom Typ 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 TObjectList<T> abzuleiten, sondern eine dedizierte Klasse zu erstellen, welche lediglich ein Feld vom Typ TObjectList<T> beinhaltet. So wie in meinem Beispiel weiter oben.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (15. Apr 2017 um 22:03 Uhr)
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
557 Beiträge
 
Delphi 12 Athens
 
#7

AW: TObjectList<> - Frage

  Alt 15. Apr 2017, 22:12
Das verstehe ich. Hab ich jetzt auch nicht verwirklicht.

Was ist der Grund, nicht direkt von 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.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: TObjectList<> - Frage

  Alt 16. Apr 2017, 03:14
Was ist der Grund, nicht direkt von TObjectList abzuleiten?
Dachte ursprünglich, dass man dann das Constraint auf TBaseClass nicht anwenden kann, aber scheint zu funktionieren, also spricht nichts mehr dagegen
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#9

AW: TObjectList<> - Frage

  Alt 16. Apr 2017, 06:48
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (16. Apr 2017 um 06:50 Uhr)
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
557 Beiträge
 
Delphi 12 Athens
 
#10

AW: TObjectList<> - Frage

  Alt 16. Apr 2017, 11:28
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.

Geändert von Benmik (16. Apr 2017 um 12:32 Uhr) Grund: ... und wieder mal Interfaces ...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:26 Uhr.
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