Нужно заставить разные объекты в одном и том же массиве реагировать по-разному

#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() , например.