Считается ли плохой практикой хранить объекты как их родительский класс и сравнивать object.getClass () с ожидаемым классом, который будет приведен к подклассу.
объяснение: как часть 2D-игры на основе тайлов Движение У меня есть несколько типов объектов GameObject, таких как «Портал», «Игрок», «NP C», «Сундук» и т. д. c. Каждый хранится в двумерном массиве, составляющем каждый уровень, который также действует как очередь обновления и рендеринга, а GameObject воплощает информацию, требуемую уровнем. Если я сохраню все объекты как родительский тип GameObject, то приведу их к их фактическому классу, например (в классе Player):
private void checkPosition(x, y) {
GameObject obj = Level.getObject(x,y);
if(obj instanceof NPC) {
NPC npc = (NPC)obj;
//interact with npc
} else if(obj instanceof Chest) {
//handle chest
}
}
Будет ли это обычно труднее читать? Какие проблемы у меня могут быть при этом? Что было бы лучшим методом, если бы каждый из них использовал массив для взаимодействия друг с другом, и в будущем у меня, вероятно, будут другие типы «GameObjects», каждый из которых имеет принципиально разные функциональные возможности.
Извините, если это Я не совсем уверен, как объяснить этот вопрос.
edit: Я должен уточнить, что подобный код может быть запущен из других подклассов GameObject, а не только из Player (ie NP C или более поздней версии). Класс), и основной упор делается на возможность изменять взаимодействие между каждым подклассом без изменения сохраняющего класса Level каждый раз, когда создается или изменяется один из его потенциально хранимых классов. спасибо тем, кто рекомендовал instanceof
Я обновил вопрос, чтобы сосредоточиться на других частях, но я, вероятно, буду использовать его с этого момента. Спасибо за отзыв.
Заключение: я решил go для варианта ответа Даниу, где у каждого GameObject есть свой собственный подкласс AI, который расширяет заглушку / адаптер упомянутого интерфейса. Таким образом, мне не нужно реализовывать реакции для любого класса, я могу дать разное поведение одному и тому же типу объекта, и взаимодействие при обработке должно выглядеть следующим образом:
getObject(x,y).getAI().react(obj);