OOP Zwei Objekte beziehen sich aufeinander (Zirkelbezug)?

Willibergi

Mitglied
Moin,
ich habe zwei Objekte, nennen wir sie mal ObjA und ObjB.
Diese werden nacheinander definiert, also zuerst ObjA und dann ObjB.
Das Problem ist aber, dass der Konstruktor von ObjA eine Eigenschaft von ObjB erwartet und der von ObjB eine Eigenschaft von ObjA.
Also hier mal der Code:
Java:
Player player = new Player(f.getContentPane().getWidth(), f.getContentPane().getWidth());
      
        Frame f = new Frame(player);
Das Objekt player erwartet die Innenmaße des Frames, und der Frame erwartet den player.
Ich glaube so etwas nennt man Zirkelbezug.
Das Objekt player kann nicht initialisiert werden, da das Frame-Objekt noch nicht definiert wurde. Andersrum habe ich dasselbe Problem.
Wie löse ich das ganze jetzt?
LG Willibergi

PS: Das Objekt Frame ist eine Klasse, die ich erstellt habe.
 
Theorie:
Verwende einen Default Konstruktor, dort initialisiert du alles von Frame was du initialisieren kannst ohne den Player zu brauchen.
Dann fügst du eine Methode "initialize(Player player)" hinzu und initialisiert dort alles wofür du den Player brauchst.

Mir kommt es sehr komisch vor das dein Player Objekt die Höhe und Breite der Anzeige braucht, bzw. wozu braucht dein Frame das Player Objekt?
Möglicherweise kann man hier ansetzen und diese Ringabhängigkeit auflösen.
 
Das player-Objekt braucht die Höhe und die Breite, damit in der Methode, die die Position updatet, eine Kollision mit dem Rand des Fensters erkannt werden kann.
In der Frame-Klasse wird der Player (der momentan nur ein rotes Quadrat ist) gezeichnet, dafür brauche ich seine Maße, etc. (die Maße sind eigentlich auch noch im Player-Konstruktor, die habe ich nur zur Übersichtlichkeit für das Forum hier rausgeschmissen)
Ich habe jetzt einfach der update-Methode den Frame übergeben, dann kann in dieser geprüft werden, ob eine Kollision stattgefunden hat.
Danke für deine Hilfe!
LG Willibergi
 
Schön das es nun funktioniert.

Bei deiner Beschreibung sehe ich schon das eigentliche Problem: fehlende Aufgaben-/Zuständigkeitstrennung.
Anscheinend übernimmt die Klasse Player auch die Aufgabe auf Kollisionen zu prüfen, das sollte sie aber gar nicht tun. Die eigentliche Aufgabe sollte das verwalten/halten von Daten sein.

Jede Klasse sollte nur eine Aufgabe haben in deinem Fall würde Player einfach nur die Daten für den Spieler halten (welches Sprite soll gezeichnet werden, die aktuelle Position vom Spieler, Lebenspunkte, ....). Die Klasse Frame kümmert sich nur um die Anzeige (bekommt also alles übergeben was gezeichnet werden soll und zeichnet nur).
Die Überprüfung auf Kollisionen würde ich in eine weitere Klasse auslagern. Diese Klasse kann ohne Probleme ein Player und Frame Objekt übergeben bekommen und damit arbeiten und rechnen.
Dadurch sollte sich deine Ringabhängigkeit von alleine auflösen und der Code sollte klarer getrennt sein 🙂
 

Zurück
Oben