Hallo, ich frage mich, ob es eine einfache Lösung für mein Problem ist,Arraylist verschiedene Objekte derselben Superklasse enthält - wie Methode einer Unterklasse zugreifen
Ich habe eine ArrayList
:
ArrayList <Animal> animalList = new ArrayList<Animal>();
/* I add some objects from subclasses of Animal */
animalList.add(new Reptile());
animalList.add(new Bird());
animalList.add(new Amphibian());
Sie alle implementieren eine Methode move()
- Die Bird
fliegt, wenn move()
aufgerufen wird. Ich weiß, ich gemeinsame Methoden und Eigenschaften der Super-Klasse unter Verwendung dieser
public void feed(Integer animalIndex) {
Animal aAnimal = (Animal) this.animalList.get(animalIndex);
aAnimal.eat();
}
ist das in Ordnung zugreifen können - aber jetzt würde Ich mag die move()
Methode für den Zugriff auf die Unterklasse Bird
hat. Ich kann dies durch Gießen der Animal
als Bird
:
Bird aBird = (Bird) this.animalList.get(animalIndex);
aBird.move();
In meiner Situation mag ich nicht, dies zu tun, wie es Ich habe 3 verschiedene Sätze des obigen Codes eines für jeden Subtyp bedeuten Animal
.
Es scheint ein bisschen überflüssig, gibt es einen besseren Weg?
Warum sollte nicht Tier hat eine 'move()' Methode, die Sie in den Unterklassen außer Kraft setzen? –
... Call move? Wenn es die Unterklassen-Implementierung nicht aufruft, gibt es etwas, was Sie uns nicht sagen. –
@ user2278797 Nur damit Sie es wissen: Ich habe Ihre Frage zur besseren Formatierung bearbeitet und die Namen der Klassen geändert (weil sie in Ihrem Code inkonsistent waren): Ich entfernte die 's'-e aus den Namen in den Zeilen, zu denen sie hinzugefügt wurden 'Tierliste'. Sie waren: 'animalList.add (new Reptiles()); Tierliste.füge hinzu (neue Vögel()); animalList.add (new Amphibians()); 'Und jetzt sind:' animalList.add (new Reptile()); animalList.add (neuer Vogel()); animalList.add (neuer Amphibian()); '. Wenn Sie sie in einem beliebigen Code verwendet haben, stellen Sie sicher, dass Sie sie entsprechend ändern oder den Code Ihrer Frage erneut bearbeiten. – acdcjunior