У меня есть игра с разными уровнями, с большим количеством общего кода между уровнями. Итак, у меня есть MainActivity, который содержит весь общий код, и он загружает фрагмент LevelOne для каждого уровня с кодом, специфичным для уровня. Мне нужно использовать фрагменты, так как я также загружаю другие фрагменты с другими компонентами пользовательского интерфейса.
Все фрагменты уровня содержат одноименные функции с кодом, уникальным для каждого уровня, например StartGame() и PauseGame(), которые MainActivity вызывает при необходимости. Как мне загрузить один объект, который позволит мне получить доступ к этим функциям, независимо от того, какой это фрагмент?
Например. в питоне я бы сделал:
// Instantiation
int level_number = 1;
levels = [levelOne, levelTwo]
level = levels[level_number]
// Something happens and I want to start the currently selected level somewhere in MainActivity
level.StartGame()
но в Java я не могу этого сделать, так как мне нужно заранее указать класс объекта, которого я не знаю, и вместо этого я должен иметь эти условия if везде, где я ссылаюсь на уровень:
// Instantiation
LevelOne levelOne = new LevelOne();
LevelTwo levelTwo = new LevelTwo();
// Something happens and I want to start the currently selected level somewhere in MainActivity
if (level_number == 1) {
levelOne.StartGame();
} elif (level_number == 2) {
levelTwo .StartGame();
}




Зачем вам нужен еще один класс для каждого уровня?
Level levelOne = new Level(1);
Level levelTwo = new Level(2);
@ Джеймс, у вас все еще может быть абстрактный класс BaseLevelFragment, а затем LevelOne extends BaseLevelFragment ... это должно резко уменьшить избыточность кода, позволяя при этом реализовывать пользовательские методы на каждом уровне. нужно просто различать, что у них общего и что различается.
Так вы имеете в виду, что вместо MainActivity есть BaseLevelFragment, который будет содержать весь общий код?
@James определите public abstract class BaseLevelFragment и переместите в него код, общий для этих фрагментов. ключевое слово abstract предотвращает его прямое создание, поскольку имеют значение только конкретные реализации... и там можно использовать общие методы, как если бы они были в одном классе; по крайней мере, пока область применения protected.
@MartinZeitler, это не решает исходную проблему, так как мне тогда нужно будет определить LevelOne levelOne при ссылке на него из общего кода в MainActivity?
@ Джеймс, тебе не нужно определять все сразу, это бесполезно. просто добавьте private BaseLevelFragment currentLevel, который может содержать ссылку на текущий экземпляр, независимо от того, класс ли это LevelOne или LevelTwo. большая часть кода в MainActivity — это плохой дизайн при использовании Fragment, который должен быть автономным.
@NormR, насколько я знаю, вы не можете использовать карту (или списки) для разных классов, только внутри класса
Потому что в каждом классе заметно разный код (каждый уровень — это, по сути, отдельная игра).