OOP Zugriff auf Objekte A in Klasse A aus Objekt B in Klasse B

Discordia

Mitglied
Hallo liebe Forengemeinde,
ich bin jetzt relativ frisch dabei, hab im Gymnasium 4 Jahre Info gehabt und Java programmiert. Jetzt bin ich in der Uni und komme auch ziemlich gut klar, habe aber nebenbei ein bisschen angefangen an einem eigenen Projekt zu arbeiten. Ein kleines einfaches Tetris. Dort bin ich nun auf einen Fehler gestoßen den ich unten versucht habe nachzubauen.
Meine Frage:
Ist es möglich aus einem Objekt heraus, auf Objekte zuzugreifen, die in anderen Klassen erzeugt wurden?

Dies ist meine Klasse A:

Java:
public class KlasseA {
  private int a;
  
  public KlasseA(int a) {
    this.a = a;
  }
  
  public void setA(int x) {
    this.a = x;
  }
  
  public int getA() {
    return this.a;
  }
       
}

Dies ist meine Klasse B:

Java:
public class KlasseB {
  private int b;
  
  public KlasseB() {
    this.b = neu.getA();    //Warum geht das so nicht? error: cannot find symbol
  }
  
  public void setA(int x) {
    this.b = x;
  }
  
  public int getA() {
    return this.b;
  }
  
}

Dies ist meine Test Klasse mit main Methode:

Java:
public class test {
  public static void main(String[] args) {
    KlasseA neu = new KlasseA(5);
    KlasseB neu2 = new KlasseB();
  }
}

Ich würde mich über Hilfe sehr freuen, da ich dort grade sehr hänge. Wenn jemand auch ein Dokument kennt, inwelchem ich mir speziell zu diesem Themenbereich noch was anlesen kann, wäre das schön. Ich habe versucht was zu dem Thema zu finden, habe auch einige Beiträge gefunden bin aber leider nicht draus schlau geworden.

Ich danke schonmal im voraus für etwaige Hilfe 🙂
 
Die Variable ist nur in der Main sichtbar.
Du könntest entweder Klasse B eine Instanz von Klasse A übergeben, falls es Sinn macht.
Alternativ könntest du einen Vermittler dazwischen hängen.
 
So ich habe hier eine Lösung. Wäre Sie so wie du Sie angedacht hattest? Wie könnte man einen Vermittler den realisieren?

KlasseA:
Java:
public class KlasseA {
  private int a;
  
  public KlasseA(int a) {
    this.a = a;
  }
  
  public void setA(int x) {
    this.a = x;
  }
  
  public int getA() {
    return this.a;
  }      
}

KlasseB:
Java:
public class KlasseB {
  private int b;
  private KlasseA g;
  
  public KlasseB(KlasseA g) {
    this.g = g;
    this.b = g.getA();
  }
  
  public void setB(int x) {
    this.b = x;
  }
  
  public int getB() {
    return this.b;
  } 
}

Test Klasse mit main():
Java:
public class test {
  public static void main(String[] args) {
    KlasseA neu = new KlasseA(5);
    KlasseB neu2 = new KlasseB(neu);
    
    System.out.println("Hier a aus neu: " + neu.getA());
    System.out.println("Hier a aus neu2(über neu): " + neu2.getB()); 
  }
}
 
Grob so:

Java:
public class Tester {
	public static void main(String[] args) {
		final KlasseA neu = new KlasseA(5);
		KlasseB neu2 = new KlasseB(new ABVermittler() {
			public KlasseA getA() {
				return(neu);
			}
		});

		System.out.println("Hier a aus neu: " + neu.getA());
		System.out.println("Hier a aus neu2(über neu): " + neu2.getB()); 
	}
	private interface ABVermittler {
		public KlasseA getA();
	}
}

So musst du, wenn sich A verändert nur noch den Vermittler aber nicht die Klassen, die ihn benutzen anpassen.

Allerdings würde ich die Methoden eher als "Befehler" designen. Zwar spricht nichts gegen eine Datenklasse (ist für Datenspeicherung wohl auch das Beste), allerdings sind die Klassen durch Getter oft von außen steuerbar. Dadurch verlierst du Methoden für DRY, Strukturänderungen und Kontrolle.
Hast du z. B. einen getter für eine Position auf Point die nur Positionsangaben von 0 - Integer.MAX_VALUE erlaubt könntest du das per neu.getLocation().x = -42; umgehen. Andererseits könnte man das in dem Fall mit getX durch einen primitiven Type verhindern. Mir fällt gerade kein besseres Beispiel ein.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben