![]() |
AW: Class Helper als Lösung für zirkuläre Unit-Referenzen
Zitat:
[/QUOTE] Und wenn ich nun schon zwei artfremde Interfaces in eine Datei packe, kann ich auch gleich die paar Zeilen mehr für die Klassen angehen und wieder alles in einen Topf werfen.[/QUOTE] Ich sagte doch: Eine Datei mit allen Interfaces ist allemal übersichtlicher als eine Datei mit allen Klassen.
Delphi-Quellcode:
Und die Implementierung in separaten Dateien.
Type
IBesitzer = interface ... IHund : Hund; end; IHund = interface Besitzer : IBesitzer; end; |
AW: Class Helper als Lösung für zirkuläre Unit-Referenzen
Zitat:
genau. Und das Vorgehen bewahrt dann einen auch davor an Stellen "aus Versehen" die Implementierung (=Klasse) zu verwenden, wo das Interface ausreicht. |
AW: Class Helper als Lösung für zirkuläre Unit-Referenzen
Eine andere Lösung ist eben die von mir angesprochene. Die bevorzuge ich eher. Wir benutzen normalerweise auch eine Datei pro Interface und eine pro Klasse. Mit der Lösung funktioniert das problemlos, egal ob mit Interface oder Klasse:
Delphi-Quellcode:
TCustomDogOwner = class
public procedure Schimpfen; end; TDog = class private FOwner: TCustomDogOwner; public property Owner: TCustomDogOwner read FOwner write FOwner; end; TDogOwner = class private FDog: TDog; public property Dog: TDog read FDog write FDog; end; |
AW: Class Helper als Lösung für zirkuläre Unit-Referenzen
Die habe ich auch mal verwendet, aber das ist eben ein Trick, der den Code verunstaltet. TDogOwner führt keine neuen Methoden oder Eigenschaften (mit Ausnahme der Referenz) ein. Ich muss also manchmal einen Typecast verwenden und manchmal nicht:
Delphi-Quellcode:
Welche Klasse sollte man denn verwenden, wenn man einen Hundebesitzer instantiieren will? Das ist nicht klar, weil zwei Klassen existieren, wo eine reicht.
MyDog.Owner.Schimpfen;
if MyDog <> TDogOwner(MyDog.Owner).Dog Then Writeln('The dog was stolen'); Dient alles nicht der Übersichtlichkeit. |
AW: Class Helper als Lösung für zirkuläre Unit-Referenzen
Zitat:
Und ich glaube auch generell in der VCL, denn irgendwie haben 3/4 aller Klassen ein "Custom" im Namen, alle die es nicht haben, sind meist abstrakt :-D Ich bin in meinen ersten Delphi-Monaten bislang nie in die Lage gekommen, Interfaces anstatt abstrakter Klassen zu nehmen. Irgendeine konkrete Teilimplementierung ließ sich bislang immer in eine Oberklasse herausziehen. Aber wie gesagt, ob das obendrüber jetzt nun ein Interface oder eine Klasse ist kümmert ja niemanden. Zitat:
Delphi-Quellcode:
?
TCustomDogOwner = class(TDogOwner)
Dann markiere ich den TDogOwner noch als abstrakt damit mir keiner einen instanziiert. Zitat:
|
AW: Class Helper als Lösung für zirkuläre Unit-Referenzen
Zitat:
Du hast völlig recht und ist sicherlich besser als einen ClassHelper zu verwenden. Ich vermeide so was inzwischen allein für die Auflösung von zirkulären Beziehungen eine weitere Vererbungshierarchie einzuführen. In einem größeren Projekt in dem ich das Businessmodell erstellt habe, fand ich am Ende im Basisframework (das aus ca. 6 Vererbungsebenen bestand) allein 2 Ebenen die ich nur für die Auflösung der zirkulären Referenzen eingeführt hatte. Am Ende waren die beiden Ebenen aber mit Funktionalität so erweitert worden (durch Kollegen), dass die nicht mehr so einfach zu entfernen waren. Interfaces bieten hier die Möglichkeit einen deutlich lockeren Verbund zu erstellen. Durch die Maßgabe gegen das Interface zu implementieren und nicht gegen eine Implementierung kann ich die Implementierung auch jederzeit austauschen, z.B. um Tests durchzuführen... Grüße |
AW: Class Helper als Lösung für zirkuläre Unit-Referenzen
Zitat:
Ansonsten, ich habe gerade mal nachgeschaut, meine einfachsten mit Delphi 2006 kompilierten Programme (also schon etwas mehr als eine leere Anwendung) sind in der Regel so 500 – 600kb groß. Was unter neueren Delphis die Kompilate so aufbläht, ist wohl vor allem die erweiterte RTTI. |
AW: Class Helper als Lösung für zirkuläre Unit-Referenzen
Ach macht doch wat ihr wollt :mrgreen:
|
AW: Class Helper als Lösung für zirkuläre Unit-Referenzen
Zitat:
Ich selbst habe das bisher eigentlich immer ohne Kreuzreferenz lösen können. Zitat:
Custom ist die Basis für konkrete Ableitungen, die dann nicht mehr das Custom drin haben. Zum Beispiel:
Delphi-Quellcode:
TCustomEdit = class(TWinControl)
TCustomMemo = class(TCustomEdit) TEdit = class(TCustomEdit) TMemo = class(TCustomMemo) |
AW: Class Helper als Lösung für zirkuläre Unit-Referenzen
Zitat:
Gruß, Sven |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 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