Moin!
Ich habe zwar schon eine Weile mit Java zu tun, habe bisher aber keine Antwort auf diesen eigentlich einfach erscheinenden Sachverhalt gefunden:
Man hat eine abstrakte Klasse/ein Interface und darunter implementierende Klassen. Des Weiteren hat man eine Klasse mit einer Operation, die als Parameter diese Klasse/dieses Interface hat und je nach konkreter Klasse auch etwas Unterschiedliches anstellt.
Zur konkreten Klasse zu deligieren geht nicht, da diese ja strohdoof sein und von der anderen Klasse gar nichts wissen soll.
Hier einfach mal ein Beispiel:
Wie löst man dies nun richtig? Wohl nicht durch das Überprüfen des Laufzeittyps mit einer Abfrage pro Implementierung?
Als weiteres Problem seh ich hier noch, dass Animal über eine anonyme Klasse extendiert werden kann, wodurch die
dann nicht vollständig ist. Gibt es eine Möglichkeit, zu verhindern, dass eine abstrakte Klasse "von außen" extendiert wird?
geht hier ja nicht, weil die Klasse bereits Subklassen besitzt.
Ich habe zwar schon eine Weile mit Java zu tun, habe bisher aber keine Antwort auf diesen eigentlich einfach erscheinenden Sachverhalt gefunden:
Man hat eine abstrakte Klasse/ein Interface und darunter implementierende Klassen. Des Weiteren hat man eine Klasse mit einer Operation, die als Parameter diese Klasse/dieses Interface hat und je nach konkreter Klasse auch etwas Unterschiedliches anstellt.
Zur konkreten Klasse zu deligieren geht nicht, da diese ja strohdoof sein und von der anderen Klasse gar nichts wissen soll.
Hier einfach mal ein Beispiel:
Java:
public abstract class Animal {}
Java:
public class Cat extends Animal {}
Java:
public class Dog extends Animal {}
Java:
public class AnimalManager {
private final Collection<Animal> animals = new ArrayList<Animal>();
private boolean nice = false;
public void makeNoises() {
for (Animal animal : animals)
System.out.println(makeNoise(animal));
}
public String makeNoise(Animal animal) {
// ???
return null;
}
private String makeNoise(Cat cat) {
return nice ? "Miau." : "Fauch.";
}
private String makeNoise(Dog dog) {
return nice ? "Wuff." : "Bell.";
}
public static void main(String[] args) {
AnimalManager manager = new AnimalManager();
manager.animals.add(new Cat());
manager.animals.add(new Dog());
manager.makeNoises();
}
}
Als weiteres Problem seh ich hier noch, dass Animal über eine anonyme Klasse extendiert werden kann, wodurch die
Code:
makeNoise
Code:
final