Как избежать instanceof для набора объектов класса с многоуровневой структурой наследования? - PullRequest
0 голосов
/ 08 марта 2020

Допустим, у нас есть многоуровневая структура наследования, такая как: 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 (), который ничего не делает в каждом суперклассе утконоса. Так есть ли другие решения без изменения всей структуры? Или вышеприведенная структура просто плохой дизайн?

...