Допустим, у нас есть многоуровневая структура наследования, такая как: Animal
Chordate extends Animal
Mammal extends Chordate
Monotreme extends Mammal
Platypus extends Monotreme
. И я ссылаюсь на них по их идентификаторам в обобщенном c классе, который содержит карту, например
class IDAdmin<T> {
Map<Integer, T> idMap;
T access(int id) {
return idMap.get(id);
}
}
Так что теперь у меня есть класс имитации зоопарка, который хочет, чтобы животное откладывало яйцо, если идентификатор упомянутое животное действительно может откладывать яйца (в данном случае это может быть только утконос).
class ZooSimulation {
IDAdmin<Animal> animalID;
void layEgg (int id) {
...
}
Ну, самое простое решение для заполнения ... это instanceof и downcasting
Animal animal = animalID.get(id);
if (animal instanceof Platypus) {
((Platypus) animal).layEgg();
}
Instanceof считается запахом кода, и вы должны избегать его, используя полиморфизм. Используя полиморфизм, мне пришлось бы написать метод layEgg (), который ничего не делает в каждом суперклассе утконоса. Так есть ли другие решения без изменения всей структуры? Или вышеприведенная структура просто плохой дизайн?