Альтернатива использованию instanceof в этом случае?

поэтому в данном сценарии я не совсем уверен, как бы я реализовал это более ООП.

Учитывая следующий контекст:

  • В моей игре есть суперкласс Entity
  • Существа (движущиеся объекты) и StaticEntities (деревья/камни/и т.д.) расширяют Entity
  • У меня есть класс EntityManager.

В моем EntityManager я проверяю, зависает ли моя мышь над Entity. Если это так, я визуализирую наложение, которое показывает панель с именем сущности на ней.

В дополнение к названию я также хотел бы отобразить что-то вроде некоторых основных характеристик, таких как «здоровье» и, возможно, «мощность / максимальный удар» или что-то в этом роде. Статические Сущности не имеют боевых атрибутов. Существа, однако, делают это, но поскольку я возвращаю Сущность, я проверяю, является ли Сущность «экземпляром» Существа, и если да, то рисую боевую статистику. В противном случае просто нарисуйте имя сущности.

Может ли быть лучший, более объектно-ориентированный способ проектирования этой конструкции? Я читал, что instanceof можно избежать с помощью дизайна полиморфизма/OO.

Связанный фрагмент кода:

    if(hoveringEntity instanceof Creature) {
        hoveringEntity = (Creature) hoveringEntity;

        // Custom Util class to draw a String
        Text.drawString(g, "Max hit: " + getDamage(hoveringEntity), x, y, true, Color.YELLOW, Assets.font14);
    }

person iPsych0    schedule 23.11.2017    source источник
comment
Добро пожаловать в Stack Overflow! Пройдите тур, осмотритесь и прочитайте справочный центр, в частности Как мне задать хороший вопрос? и На какие темы я могу здесь задать вопрос?. Невозможно сказать это, увидев только 3 строки вашего кода. Это вопрос дизайна, затрагивающий множество ваших занятий.   -  person Timothy Truckle    schedule 23.11.2017
comment
Должен/может быть метод getDisplayInfo(), который возвращает то, что должно отображаться. Затем вы можете переопределить это, чтобы предоставить столько информации, сколько хотите. В данный момент вы пишете в императивной манере, если х — это сущность, сделайте то, если х — существо, сделайте то, тогда как это должно быть скорее позволение х делать то, что ему нужно.   -  person Kayaman    schedule 23.11.2017


Ответы (1)


С такими системами классов EntityManager, вызывая абстрактный метод getInfo() (реализованный в конкретных классах StaticEntity и Creature), может получить необходимую информацию.
Возможно, это не лучшее решение, поскольку оно вводит жесткую связь между EntityManager и Entity, но не требует использования instanceOf.

person Jul10    schedule 29.11.2017