Array of Object & abgeleitete Objekte

Status
Nicht offen für weitere Antworten.
G

Gäschtle

Gast
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:

Code:
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!
 
S

SlaterB

Gast
if (x instanceof String) {
}

leichter zu klammern:

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

}
 
G

Gäschtle

Gast
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?
 
S

SlaterB

Gast
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:
Code:
abstract doYourSpecialOperation();

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

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

Gäschtle

Gast
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 :)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben