Предыстория:
В настоящее время я работаю над игрой, в которой будет несколько типов мебели, таких как стулья, столы или картины, с которыми игрок сможет взаимодействовать. Для этого я создал абстрактный класс GameObject
, который обрабатывает все, что есть общего у всех этих объектов (например, рисование, хранение переменных положения и т. д.). Предметы мебели будут иметь несколько разных параметров, таких как ширина и высота (целые числа), а также то, что происходит, когда пользователь решает взаимодействовать с ними (например: стулья -> если игрок близко, садитесь, столы -> ничего). , картины -> рассматривать независимо от расстояния). Мебель можно создать из меню, которое возвращает какой-то идентификатор для выбранного предмета (в настоящее время целое число).
Вопрос:
Как реализовать разные предметы мебели?
Один из способов — создать подкласс для каждого предмета мебели. Но у этого есть два недостатка; Во-первых, будет сложно управлять таким количеством классов, а во-вторых, когда будет создана мебель, нужно будет каким-то образом создать правильный подкласс GameObject на основе идентификатора (см. дополнительный вопрос).
Мне кажется, что наиболее логичным вариантом является создание общего класса, который принимает параметры ширины и высоты в конструкторе, а также работающий/другой интерфейс, который может запускаться, когда пользователь щелкает объект. Различные значения могут быть сохранены в базе данных и извлечены на основе идентификатора, но проблема все еще возникает с различными действиями, поскольку Runnables не могут быть сохранены извне, и это приводит к той же проблеме, что и решение 1; Много разных классов, где нужно выбрать один для текущего объекта.
Дополнительный вопрос: в зависимости от типов мебели и действий может потребоваться более продвинутый подкласс с дополнительными методами. Если да, то проблема выбора, какую из них реализовать в зависимости от идентификатора, остается вне зависимости от решения предыдущего вопроса. Я не хочу использовать гигантский оператор switch для создания экземпляров разных классов, так есть ли способ обойти это?
Игра предназначена для платформы Android, но в будущем может быть порт для IOS, поэтому ответы, специфичные для Java, не предпочтительны, но приемлемы.