![]() |
Kreuzende Beziehung zw. zwei Objekten
Hallo Delphi-/Pascal-Programmierer.
Ich hab weniger ein Problem, als eine allgemeine Frage. Wie implementiere ich zwei Objekte, die jeweils eine Beziehung zum Anderen pflegen? Beispiel:
Delphi-Quellcode:
A und B sind in unterschiedlichen Modulen (zB: mA, mB).
type
A = class private <list of B> [...] end; type B = class private myA: A; [...] end; ist es in irgend einer Weise möglich, dass zu realisieren, oder muss ich beide Definitionen in eine Type-Klausel (also in EIN Modul) beschreiben? Gegen das "Ein-Modul-Konzept" spricht meine Philosophie, jedes Objekt in seine eigene Unit. (Type-Casting auf untypisierte Pointer kommt aus stilistischen Gründen nicht in Frage) Ich sehe selbst leider keine Möglichkeit, aber ich will es nicht unversucht lassen und frage deshalb euch :-) Ich hoffe, ihr könnt mir Tipps geben Vielen Dank an euch |
Re: Kreuzende Beziehung zw. zwei Objekten
Einfach die Unit von B in den Uses einbinden
|
Re: Kreuzende Beziehung zw. zwei Objekten
Kommt auf die Beziehung an. Eventuell kannst Du Abstrakte Klassen oder Interfaces in eine dritte Unit auslagern...
Edit: Zitat:
|
Re: Kreuzende Beziehung zw. zwei Objekten
Hatte das gleiche Problem. Wollte es auch in eigenen Units lassen und habe es wie oft im VCL-Quellcode gelöst.
Pointer auf TObject ubergeben und Gültigkeit vorm Cast via Classname abfragen. Das ist kaum besser als untypisierte Pointer, aber ich hab' nach langem suchen auch keinen anderen Weg gefunden. |
Re: Kreuzende Beziehung zw. zwei Objekten
man hat ja Hoffnung, dass wenn sie jetzt den 64 Bit Compiler eh neu machen müssen, dass dieser Quatsch endlich mal in Delphi behoben wird.
Und alle Meinungen, die man sogar gelegentlich hört, es wäre sogar ein Feature statt ein Failure, (manche behauptetn ja sogar, dass dann was mit dem klassenkonzept nicht stimmen würde) sind auch nur halbherzig. Denn in einer einzigen Unit funktioniert es ja, dass man überkreuzende Bezüge zu Klassen herstellen kann, warum also nicht auch in verschiedenen Units, für mich ist da kein Unterschied. Es führt dazu, dass man viel zu viel Quelltext in eine einzige Unit stecken muss. Modularisierung wäre schon toll... |
Re: Kreuzende Beziehung zw. zwei Objekten
ich benutze gelegentlich diese Lösung. So wird zumindest der Quellcode durch die unschönen Casts nicht belastet und bleibt damit befreit von unwichtigen Sachen. Meine Meinung ist, es sollte möglichst nur das in einer Funktion stehen, was wirklich zum funktionieren der Funktion wichtig ist.
![]() |
Re: Kreuzende Beziehung zw. zwei Objekten
@mirage228:
Ja, die Idee kam mir auch (ist auch vom Stil her elegant): Hat man nur noch eine Klasse (und ein Modul) mehr :-( Danke euch für die schnellen Antworten: Für die Vollständigkeit:
Delphi-Quellcode:
type
A1 = class [...] end;
Delphi-Quellcode:
type
B = class <list of A1> [...] end;
Delphi-Quellcode:
type
A2 = class(A1) myB: B; [...] end; Gibt es in Delphi abstrakte Klassen (wär der Wahnsinn!)??? |
Re: Kreuzende Beziehung zw. zwei Objekten
Zitat:
|
Re: Kreuzende Beziehung zw. zwei Objekten
@stoxx:
Dieses "forward"-Deklarieren ist zwar hilfreich, aber entspricht nicht dem Ansatz: Erst Deklarieren, dann nutzen. Wie erstelle ich abstrakte Klassen (man könnte ja den Constructor virtual abstract definieren -> nicht sehr elegant) |
Re: Kreuzende Beziehung zw. zwei Objekten
@mirage228:
NOCH nicht? in Pascal gab's die mal, also kann man davon ausgehen, dass es sie auch in Zukunft nicht mehr geben wird (schade eigentlich). |
Re: Kreuzende Beziehung zw. zwei Objekten
In Delphi kann man Klassen mit abstrakten Methoden trotzdem instantiieren. Erst beim Zugriff auf eine nicht implemnetierte Methode wird dann eine Exception ausgelöst.
|
Re: Kreuzende Beziehung zw. zwei Objekten
Zitat:
Mit "noch nicht" meinte ich, dass dieses Feature ja evtl. in späteren Versionen hinzugefügt wird... |
Re: Kreuzende Beziehung zw. zwei Objekten
reine Neugier, was kann man mit abstrakten Klasse machen, was man mit abstrakten Methoden nicht realisieren kann?
|
Re: Kreuzende Beziehung zw. zwei Objekten
Eine Ableitung erzwingen. Dürfte aber für dieses Problem nicht entscheidend sein.
|
Re: Kreuzende Beziehung zw. zwei Objekten
Zitat:
und warum hat dann Delphi nichts dagegen, Units im Implementationsteil dann doch wieder gegenseitig zu überkreuzen und eine Abhängigkeit herzustellen. Wenn es doch so gewollt ist, hätte man das doch auch unterbinden müssen, oder nicht? Also doch eher eine Compilerschwäche (oder Stärke) .. ist halt schneller beim compilieren. |
Re: Kreuzende Beziehung zw. zwei Objekten
@stoxx:
mir persönlich gefällt diese (erlaubte) Kreuzverwendung überhaupt nicht. Zitat:
Man kann bei der (abstrakten) Klasse A1 (aus meinem Beispiel) davon ausgehen, dass A2 verwendet wird. |
Re: Kreuzende Beziehung zw. zwei Objekten
War Antwort auf Frage von stoxx
|
Re: Kreuzende Beziehung zw. zwei Objekten
Zitat:
Ein Motor im Auto kann man auch herausnehmen. Klar, alleine ohne Auto kann man damit nix anfangen, aber zumindest ist er austauschbar. Auch Deine Graphikkarte im Computer ist alleine nicht verwendbar, trotzdem kann man sie getrennt vom Computer lagern, wenn man dies möchte. @ War Antwort auf Frage von stoxx ah Danke .. da entfallen ja dann die Messageboxen mit der Angabe des Klassennamens, wenn man mal wieder eine virtual abstracte Methode vergessen hat zu programmieren :) |
Re: Kreuzende Beziehung zw. zwei Objekten
Hab ich schon einmal geschrieben.
Ich verfolge eine strikte Philosophie: Erst sagen, wie etwas aussieht, bevor man es verwendet. dieses Prinzip (wie es der Delphi-Compiler verwendet), dass man innerhalb des SELBEN Type-Konstruktes Kreuz-Deklarationen erzeugen darf, geht NOCH in Ordnung, da man dies Überschauen kann. Aber dieses Prinzip auf ganze Module angewandt, ist unübersichtlich und darf nicht erlaubt sein. |
Re: Kreuzende Beziehung zw. zwei Objekten
Lässt sich aber nicht verhindern.
|
Re: Kreuzende Beziehung zw. zwei Objekten
1.
Delphi-Quellcode:
2. Wie soll die Klassengröße beim Kompilieren bestimmt werden, wenn sich Typdefinitionen zikulär über mehrere Dateien verwenden? Das geht nicht, nicht mit Einzellaufkompilern. Und das Konzept ist gut so, wie es ist! -- mM.
type
TAbstract = class abstract // abstrakte Klasse. end; |
Re: Kreuzende Beziehung zw. zwei Objekten
Zitat:
|
Re: Kreuzende Beziehung zw. zwei Objekten
bei abstrakten Klassen spielt die benötigte Größe gar keine Rolle.
|
Re: Kreuzende Beziehung zw. zwei Objekten
Zitat:
Zitat:
|
Re: Kreuzende Beziehung zw. zwei Objekten
ok, wir reden hier sicher von verschiedenen Schuhen.
Erklär mir das bitte näher: in wiefern benötigt ein Compiler die Größe einer abstrakten Klasse? Und für die "richtige" (abgeleitete) Klasse kennt er doch die abstrakte Klasse. |
Re: Kreuzende Beziehung zw. zwei Objekten
Zitat:
Delphi-Quellcode:
Und jetzt für zwei abstrakte Klassen, die sich gegenseitig verwenden: (Schenk' ich mir...)
type
TAbstract = class abstract // Größe = GrößeVon(Felder neu in TAbstract) + GrößeVon(Vorfahre(TAbstract)) // = GrößeVon(Felder neu in TAbstract) + GrößeVon(TObject) end; TConcrete = class(TAbstract) // Größe = GrößeVon(Felder neu in TConcrete) + GrößeVon(Vorfahre(TConcrete)) // = GrößeVon(Felder neu in TConcrete) + GrößeVon(TAbstract) end; Abstrakte Klasse können nicht instantiiert werden. Der Klassenzusatz "abstract" hat nur disziplinarische Wirkung, vergleichbar mit Sichtbarkeitsbeschränkungen. Insofern unterscheiden sich abstrakte Klassen nicht von "gewöhnlichen" Klassen. Die Größe ist für alle gleichsam bedeutsam. |
Re: Kreuzende Beziehung zw. zwei Objekten
DAnke für die Aufklärung...ich hab mich gewundert, warum du dich so speziell auf abstrakte Klassen fest gelegt hast. Das ist doch (wie du richtig schreibst) wurst, ob Abstrakt oder nicht...
Also: Es ist doch kein Problem von Abstrakten Klassen, dass man deren Größe nicht berechnen kann (das ist ein allgemeines Problem) - das ist der Grund für meinen Einwand. |
Re: Kreuzende Beziehung zw. zwei Objekten
Delphi-Quellcode:
ist das nicht das was ihr sucht?
type
THallo = class; THuhu = class a: THallo; End; THallo = class a: THuhu; end; oder waren 2 units gemeint? |
Re: Kreuzende Beziehung zw. zwei Objekten
Zitat:
Delphi-Quellcode:
type
TAbstract = class {abstract} FField: TAnyType; end; |
Re: Kreuzende Beziehung zw. zwei Objekten
ne, die Lösung steckt in einer übergeordneten (wär schön, wenn noch abstrakten) Klasse.
Ja, es sind mehrere Units im Spiel. |
Re: Kreuzende Beziehung zw. zwei Objekten
@Panthrax:
Hui viel Text, bitte nicht denken, ich widerspreche dir...wir sind schon einer Meinung (ich weiß, wie ein Compiler funktioniert), nur ich habe deine Aussage anders aufgefasst. Es geht um das Problem der Unmöglichkeit der Bestimmung der Größe von "zirkulären" Klassen. Nur ist das eben kein spezielles Problem von abstrakten Klassen, sondern von Allen. |
Re: Kreuzende Beziehung zw. zwei Objekten
Zitat:
Wenn man verstehen will, warum das so ist, oder es gar für eine Kompilerschwäche hält (wie oben von jemandem erwähnt) kann sich die Kompilertechnik ansehen und darf gern Verbesserungsvorschläge an die Kompilertechniker machen. :glaskugel: Zitat:
Delphi-Quellcode:
// "Unit 1"
type TRec1 = record // TAnyType1 Rec2: TRec2; end; // "Unit 2" type TRec2 = record // TAnyType2 Rec1: TRec1; end; |
Re: Kreuzende Beziehung zw. zwei Objekten
|
Re: Kreuzende Beziehung zw. zwei Objekten
Zitat:
|
Re: Kreuzende Beziehung zw. zwei Objekten
Ich hab mich (abgewandelt) zitiert.
Für mich die (bisher) beste Lösung: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 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