Methode rückwärtiger Klasse aufrufen

Hallo,

Klasse = K; instanziert = i;

K A i K B; K B i K C; K C i K D,

die Instanz der Klasse A wird bis D durchgereicht, d.h. Klasse D kann auf A zugreifen.
aber: wie kann jetzt Klasse A auf eine Methoder der Klasse D zugreifen?

vielen Dank

Gruß Gü

Sehr ungenau aber für den Fall, dass ich dich doch verstanden habe, kann D ja eine Methode in A aufrufen, mit der eine Instanz von D an A übergeben wird.
Danach kann A dann auf D zugreifen. ABER schön ist das nicht, da liegt der Hund eher in deiner Struktur begraben.

Was genau Hast du denn vor?

Was hast du den überhaupt vor? Du hast also sagen wir mal (etwas vereinfacht) sowas:

class A {
}

class B {
    private A a;

    public B(A a) {
       this.a = a;
    }
}

und möchtest dann von A eine Methode von B aufrufen? Falls ja, musst du die Instanz von B der Instanz von A bekannt machen (z.B. über setter):

public B(A a) {
    a.setB(this);
}

*** Edit ***

Möglicherweise besser wäre ein Listener-Konzept. Da du dir in meinem obigen Beispiel Abhängigkeiten schaffst. Lösen könntest du die etwa so:

	private List<AListener> listeners = new ArrayList<>();
	
	public void addAListener(final AListener listener) {
		listeners.add(listener);		
	}
	
	public void doAction() {
		for(AListener al : listeners) {
			al.doAction();
		}
	}
}

interface AListener {
	void doAction();
}

class B {
	public B(final A a)
	{
		a.addAListener(new AListener() {
			@Override
			public void doAction() {
				System.out.println("Hello World from B");
			}
		});
		
		a.doAction();
	}
}

Somit bist du unabhängig von der Klasse B und eine Klasse C könnte sich ebenso an A ranhängen.

vielen dank für die antworten, ich glaube es hilft mir sehr weiter.

was ich will ist folgendes:
ich habe ein Mainwindow mit einer Menueleiste. auf diesem mainwindow werden irgendwann panels gesetzt die bestimmte Aufgaben zu erledigen haben.
was ich jetzt möchte ist eine “Undo” Funktion zu implementieren, die einzige Möglichkeit das allgmeine abzufangen für unterschiedliche panels ist eben die Menueleiste, nur die weiß eben (noch) nichts von irgendwelchen Instanzen.
Aber ich glaube das mit dem Set reicht schon vollkommen aus.
danke gü

*** Edit ***

ups, das mit dem Listener ist ja noch besser das probiere ich mal aus gute Idee!!

Vielleicht überlegst du dir auch, logische Zuständigkeiten von deinen “JPanels” oder anderen Grafikkomponenten zu lösen und mit MVC / Observer-Pattern zu arbeiten.

Hm… Das Undo bezieht sich aber nicht auf die GUI-Elemente bzw. nicht auf die Menüleiste. Wenn man im Menü den Eintrag “Text ausschneiden” auswählt, dann will man bei einem ‘Undo’ ja nicht das Auswählen des Menüeintrages rückgängig machen, sondern das Ausschneiden des Textes - also die Operation, die durchgeführt wurde. Für sowas gibt’s http://docs.oracle.com/javase/6/docs/api/javax/swing/undo/UndoManager.html , aber um das “gut und richtig” zu machen, ist ein bißchen Einarbeitung nötig.

das undo bei mir wird gänzlich anders verwendet. im Prinzip verwalte ich Zustände, welche sich ständig ändern, was ich jetzt mache ich serialisiere die Zustände auf der Platte (was jetzt schon funktioniert) aber irgendwie möchte ich das auch wieder rückgängig machen, z.B. max. 3 Schritte zurück reicht vollkommen aus. dazu hatte ich mir CTR Z(urück) überlegt. auch das funktioniert. wenn ich es simuliere. aber dieses “ctrz” muss nun an die entsprechende Klasse weitergeleitet werden.
Anmerkung. mein programm ist absolut nach MVC aufgbaut, das mit dem Observer Pattern kenne ich nicht, werde es mir jetzt aner mal anschauen.
danke

Dann sollte es doch ausreichen das Model auf den gewünschten früheren Zustand zu setzen und der Rest passiert von „alleine“.
Auf CTRL+Z wird vermutlich per KeyListener oder KeyBinding reagiert, jetzt muss der Listener einfach nur dem Controller einfach nur die Info „undo“ weiterreichen. Der Controller deserialisiert den gewünschten Zustand und überträgt ihn aufs Model.

exakt so ist es!! nur mein problem war eben das weiterreichen des CTRZ :slight_smile:

*** Edit ***

weil der „undoreceiver“ den Controller leider nicht kennt