![]() |
Unit mit Objekten aufteilen
Hallo DP'Ler,
ich habe eine Unit mit meinen neuen Objektklassen und die wächst und wächst. Nun wollte ich auch wegen der Übersichtlichkeit und Fehlersuche diese Unit in aufteilen. Da aber sehr viele Klassen von einander abhängig sind bekomme ich nur Fehler da sich die Unit gegenseitig aufrufen. Nun meine Frage, gibt es ein Rezept bei dem es mir gelinkt diese Aufteilung durchzuführen. Gruß Dieter |
Re: Unit mit Objekten aufteilen
Einmal im Interface und einmal im Implementierungsteil
|
Re: Unit mit Objekten aufteilen
wenn schon in den öffentlichen Interfaces Klassen voneinander abhängig sind, dann gibt es keine Möglichkeit, außer die gemeinsammen Teile oder eben gemeinsame Teile nochmals auszulagern (z.B. gemeinsame Klassen oder mindestens Vorfahren derer, welche stattdessen dann in der anderen Unit im öffentlichen Teil verwendet werden)
|
Re: Unit mit Objekten aufteilen
Danke zusammen
@mkinzler so einfach ist es nicht @himitsu genau das ist mein Problem, da die Klassen sich gegenseitig über Änderungen benachrichten sind diese natürlich im Interface deklariert. Ich hatte gehofft,dass hier jemand vielleicht einen Trick kennt um dieses Problem zu lösen. Gruß Dieter |
Re: Unit mit Objekten aufteilen
Zitat:
* Interfaces statt Klassen verwenden z.B. in Methodensignaturen: dadurch kann man die starke Kopplung der Klassen auflösen. Die Interfaces werden in einer neuen Unit definiert. So können wieder 'lose Enden' entstehen (weitere Klassen, die in eigene Dateien ausgelagert werden können) * Hilfsklassen in Implementation verschieben. Beispiel:
Delphi-Quellcode:
wird zu
interface
type TMyThread = class(TThread) ... end; TMyClass = class(TObject) private FMyThread: TMyThread; ... end;
Delphi-Quellcode:
Das hilft z.B. wenn TMyThread wieder Klassen referenziert, die man lieber niht im interface hätte. Wenn TMyThread in einer eigenen Unit liegt, ist es wieder 'global' sichtbar, da sollte es nur sein wenn es eine gute Begründung gibt (Geheimnisprinzip).
interface
type TMyClass = class(TObject) private FMyThread: TThread; ... end; ... implementation type TMyThread = class(TThread) ... end; Cheers, |
Re: Unit mit Objekten aufteilen
Hallo MJustin,
das hört sich schon sehr gut an, aber so richtig verstanden habe ich das noch nicht. Bespiel
Delphi-Quellcode:
Wie würdest du das auflösen. Von dieser Wollknäuel-Methode die du beschreibst habe ich noch nichts gehört, ist sie noch irgendwo genauer beschrieben?
Type
interface TMyObj = Class(TObject) FMyObjList: TMyObjList end; TMyObjList=Class(TObjectList) FMy2ObjList: TMy2ObjList end; TMy2Obj = Class(TObject) FMy2ObjList: TMy2ObjList end; TMy2ObjList=Class(TObjectList) FMyObjList: TMyObjList FMyObj:TMyObj end; implementation Gruß Dieter |
Re: Unit mit Objekten aufteilen
Delphi-Quellcode:
Die Klasse TMy2Obj wird nicht referenziert, sie kann problemlos (unverändert) in eine eigene Unit ausgelagert werden.
Type
interface TMyObj = Class(TObject) FMyObjList: TMyObjList end; TMyObjList=Class(TObjectList) FMy2ObjList: TMy2ObjList end; TMy2Obj = Class(TObject) FMy2ObjList: TMy2ObjList end; TMy2ObjList=Class(TObjectList) FMyObjList: TMyObjList FMyObj:TMyObj end; implementation Mehr kann man anhand des Codes allein nicht sagen. Bei den anderen Klassen kommt es darauf an, welche im interface benötigt werden oder nur Hilfsklassen sind, die man auch komplett in den implementation Teil oder in andere Units verlagern könnte, wobei die Referenzen auf einen Vorfahrtyp umgestellt werden wie TObjectlist (was dann beim Zugriff einen unschönen Typecast erfordert). Schöner (aber etwas performancemindernd) wäre die Verwendung von Schnittstellentypen. |
Re: Unit mit Objekten aufteilen
Hallo mjustin,
ich habe nun verstanden was du meinst, aber so richtig weiter bringt mich das nicht, da ich nur sehr wenige Hilfklassen in den Implementatiomnsteil auslagern kann und frei zugängliche zum auslagern in andere Units sind auch sehr beschränkt. Du schreibst etwas von Schnittstellentypen, die kenne ich überhaupt nicht, sind die schon in delphi 2005 vorhanden? und wie setzt man die ein? Gruß Dieter |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:03 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 by Thomas Breitkreuz