# Klasse übergeben und Methode aufrufen?



## Shiwayari (20. Feb 2009)

Ich denke mal das gehört hier rein..

Also ich habe mir eine Klasse geschrieben, die momentan noch von einer anderen Klasse abhängig ist. Diese Abhängigkeit will ich loswerden, damit ich die Klasse auch bei anderen Projekten verwenden kann. Das Ganze sieht so aus:

Folgende Klassen A und B:

```
public class A {
  ...
  A a = new A();
  ...
  B b = new B(a);
  ...
  public void m() {
    ...
  }
  ...
}



public class B {
  private A a;
  ...
  public B(A a) {
    this.a=a;
  }
  ...
  public void callM() {
    a.m();
  }
  ...
}
```

Klasse A instanziert ein Objekt b der Klasse B und übergibt im Konstruktor eine Instanz a von sich selbst.
Objekt b benutzt diese Instanz a, um eine Methode m von a aufzurufen.

Jetzt kann ich die ganze Klasse B aber nur dann in einem anderen Projekt benutzen, wenn ich auch ein Objekt des Typs A an b übergebe.
Es soll aber unabhängig vom Typ der Klasse A die Methode m aufgerufen werden können. Z.B. soll auch eine Klasse C, die eine Methode m enthält, ein brauchbares Objekt von B benutzen können. Ungefähr so:

```
public class C {
  ...
  C c = new C();
  ...
  B b = new B(a);
  ...
  public void m() {
    ...
  }
  ...
}
```
Genau das geht ja nicht, weil c nicht vom Typ A ist.

Nun habe ich mir gedacht, ich mache das Ganze in Klasse B so:

```
public class B {
  private Object o;
  ...
  public B(Object o) {
    this.o=o;
  }
  ...
  public void callM() {
    o.m();
  }
  ...
}
```

Das scheint aber auch nicht zu gehen, da ich angezeigt bekomme, dass die Klasse Object die Methode m nicht enthält. Also ruft ein Methodenaufruf immer eine Methode der Klasse des Typs auf, mit dem das Objekt in der eigenen Klasse deklariert wurde, und nicht die Methode der Klasse des Typs des übergebenen Objekts? Kann irgendwie nicht nachvollziehen warum das sinnvoll sein soll, da man ja sowieso alle Methoden aus den übergeordneten Klassen aufrufen kann?
Also wie bekomme ich es nun hin, dass Klasse B immer die Methode m des im Konstruktor übergebenen Objekts aufruft? Vererben will ich vermeiden, da B nicht wirklich in die Hierarchie reinpasst.
Natürlich könnte ich einfach bei jedem Projekt den jeweiligen Typ in Klasse B ändern, aber das soll ja nicht Sinn der Sache sein.
Ich glaube Interfaces helfen mir da weiter, aber ich komme einfach nicht drauf wie genau ich das machen soll. Hab mich auch noch nicht so mit Interfaces beschäftigt.


----------



## Beni (20. Feb 2009)

Fehlt doch nicht mehr viel, das Interface M stellt sicher dass es eine Methode m gibt:


```
public interface M{
  public void m();
}
```

B ruft m in M auf:

```
public class B{
  private M m;

  public B( M m ){
    this.m = m;
    m.m();
  }
}
```

... und A und C müssen M implementieren.


----------



## Shiwayari (20. Feb 2009)

Okay, das hat funktioniert, danke. Also hab ich jetzt einfach A als Typ des Interfaces M, damit ich auf m() zugreifen kann. Also entspricht m.m() dann a.m(), weil a dann vom Typ M ist. Denk mal ich habs verstanden.


----------

