#java
#java
Вопрос:
Я создаю метод для использования в массиве, который содержит объекты из 3 дочерних классов одного и того же родительского класса. Я хочу, чтобы два класса реагировали по-разному, когда третий класс выполняет определенное действие. Буду ли я использовать цикл для массива с помощью .getClass() и оператора if-else-if относительно того, что делать с каждым из объектов на основе .getClass() ?
Комментарии:
1. вы только что ответили на свой собственный вопрос. Да, вы используете a
for
, и.getClass().getName()
это даст вам имя класса2. А еще лучше, почему бы вам не выполнить поиск по термину «полиморфизм»? Это одна из основных основ ооп и решит вашу проблему.
Ответ №1:
Хотя теоретически это сработало бы, использование if-else-if
переключателей на основе типа класса часто считается запахом кода.
Вы не предоставляете много дополнительной информации о том, какое поведение и реакцию вы ищете, но в качестве первого шага рассмотрите это: может ли «реакция», которую вы хотите получить от классов, разумно считаться методом класса, и может ли это быть методом классародительский класс, который дочерние классы переопределяют по мере необходимости?
(Подумайте о классическом примере с классом Animal
и методом makeSound()
, а затем классом Dog
, который переопределяет его для вывода Bark!
, и классом Cat
, который переопределяет его для вывода Meow!
)
Вы можете проверить здесь несколько идей: https://refactoring.guru/smells/switch-statements
или предоставьте дополнительную информацию, чтобы мы могли придумать хороший рефакторинг, чтобы избежать блокировки переключения.
Комментарии:
1. Спасибо за ответ. У меня есть объект room, который содержит объекты 3 дочерних классов. Один из классов может сделать комнату чистой или грязной, один из 2 других классов реагирует на изменение состояния. Один из них предпочитает чистый, а другой — грязный. Когда первый класс изменяет состояние комнаты, два других класса либо получают, либо теряют уважение.
2. Хорошо, похоже, что эти три класса должны быть способны содержать все это поведение в себе. Класс room будет предоставлять методы для запроса состояния (например
room.isClean()
) и методы для взаимодействия с состояниемroom.makeDirty()
иroom.cleanUp()
, например.