# Array of Object & abgeleitete Objekte



## Gäschtle (23. Jul 2007)

Hallo!

Ich würde gerne verschiedenartige Objekte in einem Array verwalten. Der Objetktyp an jeder Stelle im Array wird zur Laufzeit gesetzt. Vereinfacht soll es nur Objekte der KlasseA und KlasseB geben.

Da ich nicht wusste ob und wie das geht, habe ich vorerst folgende abstrahierte Lösung:


```
public abstract class Grundklasse {
  public abstract void MethodeA();
  public abstract void MethodeB();
}

public class KlasseA extends Grundklasse {
  public void MethodeA() {
  ...
  }
  public void MethodeB() { }
}

public class KlasseB extends Grundklasse {
  public void MethodeB() {
  ...
  }
  public void MethodeA() { }
}

Grundklasse[] einarray;
```

Allerdings möchte ich natürlich nicht in allen 3 Klassen immer alle Methoden definieren, die vielleicht nur von einer der beiden abgeleiteten Klassen gebraucht wird.

Stattdessen wäre eine Möglichkeit wie

einarray[3].MethodeA() praktisch.

Dafür müsste ich natürlich herausfinden, von welchem Typ das Element ist.

Gibt es direkt eine Möglichkeit, herauszufinden aus welcher Klasse ein Objekt gebaut wurde? Ansonsten könnte ich natürlich in KlasseA und KlasseB eine Methode einbauen, die den Wert zurückgibt.

Bliebe der unschöne Missstand, dass ich eine abstrakte Oberklasse brauche und alle Methoden mehrfach implementieren muss um die zu verwalten. Eine Aufteilung in 2 Arrays ist keine Lösung!


----------



## SlaterB (23. Jul 2007)

if (x instanceof String) {
        }

leichter zu klammern:

        if (String.class.isInstance(x)) {

        }


----------



## Gäschtle (23. Jul 2007)

Okay, das ist schon mal sehr nützlich, danke 


Gibt es zudem eine Art As-Operator, mit dem ich dann 

in obigem Array direkt einarray[3].MethodeA aufrufen kann oder wie verwalte ich die Instanzen verschiedener Klassen am besten in einem einzelnen Array?


----------



## SlaterB (23. Jul 2007)

Casten?

if (instanz) {
   MyClass m = (MyClass) object;
   m.xy();
}

viel schöner wirds nicht werden,


wenn aber eh jede Klasse nur eine der Oberationen der Oberklasse hat,
dann sollte vielleicht nur eine generelle Operation in der Oberklasse stehen:

```
abstract doYourSpecialOperation();

class A {
  public void doYourSpecialOperation() {
    methodeA();
  }
}
```

dann wäre ein Test auf die Klasse unnötig


----------



## Gäschtle (23. Jul 2007)

Nein, alle Klassen haben eine Menge verschiedener Methoden. Das oben war nur vereinfacht, damit der Sachverhalt klar wird. Eben weil jede Klasse so viele und verschiedene Methoden hat, wollte ich ja eine mehrfache Implementierung vermeiden.

Man kann das tatsächlich einfach so casten, darauf wäre ich nie gekommen! Habs ausprobiert und klappt super so. Kannte das zwar mit Datentypen wie (short) usw. aber dass das bei allen Klassen geht ist mir neu. Spitze


----------

