Probleme mit circular dependency
-
Hallo zusammen!
Ich stecke gerade in einem Problem, was die Abhängigkeit mehrerer Klassen untereinander betrifft. Das Projekt handelt dabei um ein Billardspiel.
Aufbau:
Klassen:
Game
GameViewBoard
CueBall
BallWhite : public Ball
BallBlack : public Ball
BallColor : public Ball
BallColorFull : public BallColor
BallColorStripe : public BallColorDas Problem ist nun, dass zuerst einmal Game von ziemlich allen Klassen abhängt, und diese wiederum alle von Game. (Jede nichtGame-Klasse hat ein Attribut von Game und umgekehrt)
Gibt es eine spezifische Methode, um das ganze möglichst elegant zu lösen oder bleibt da nur ausprobieren?
Vielen Dank schon jetzt für alle Antworten!
-
Vielleicht hilft es schon, Game als Singleton zu machen. Sonst sehe ich aber nicht allzu viele Möglichkeiten als viele gegenseitige Verweise.
Bzw: Ich persönlich finde Klassennamen wie BallColor in deinem Zusammenhang ungünstig, ich denke da zuerst, die Klasse repräsentiert eine Farbe für einen Ball, anstatt eines Balls mit einer Farbe.
Edit: Wow, eine Sekunde Unterschied zwischen Beiträgen hat man auch nicht oft^^
-
nburger schrieb:
oder bleibt da nur ausprobieren?
Ja, wie immer halt. Tut mir leid. :p
Natürlich gibt es da eine Methode. Und zwar solltest du dein Design überdenken. Warum muss
Gamealle anderen Klassen kennen und diese alleGame? Wieso reicht es nicht aus, wennGamedie anderen Klassen kennt?
-
ipsec schrieb:
Vielleicht hilft es schon, Game als Singleton zu machen.
Davon rate ich stark ab. Singletons sind globale Variablen und bringen viele der entsprechenden Nachteile mit sich. Sie sind zwar ein besonders bequemer Weg, aber langfristig schafft man sich mit Singleton in etlichen Fällen unnötige Abhängigkeiten.
Nicht ohne Grund gibt es Leute, die Singleton als Anti-Pattern bezeichnen. Es kann berechtigte Anwendungen haben, aber die sind tendenziell selten anzutreffen. Auf keinen Fall hat jede Klasse, von der es nur eine Instanz gibt, Singleton-Status verdient.
-
Wenn du in einer der Klassen einen Zeiger auf eine andere hast, kann man das mit einer Vorwärtsdeklaration machen:
class bar; class foo{ bar *a; }; class bar{ foo a; };Sowas hingegen geht nicht:
class bar; class foo{ bar a; }; class bar{ foo a; };Das wäre ein Designfehler. Wie sollte dies funktionieren?