Android: взаимодействие с общими функциями независимо от класса

У меня есть игра с разными уровнями, с большим количеством общего кода между уровнями. Итак, у меня есть 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();
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
23
1

Ответы 1

Зачем вам нужен еще один класс для каждого уровня?

Level levelOne = new Level(1);  
Level levelTwo = new Level(2);

Потому что в каждом классе заметно разный код (каждый уровень — это, по сути, отдельная игра).

James 20.03.2019 17:02

@ Джеймс, у вас все еще может быть абстрактный класс BaseLevelFragment, а затем LevelOne extends BaseLevelFragment ... это должно резко уменьшить избыточность кода, позволяя при этом реализовывать пользовательские методы на каждом уровне. нужно просто различать, что у них общего и что различается.

Martin Zeitler 20.03.2019 17:04

Так вы имеете в виду, что вместо MainActivity есть BaseLevelFragment, который будет содержать весь общий код?

James 20.03.2019 17:10

@James определите public abstract class BaseLevelFragment и переместите в него код, общий для этих фрагментов. ключевое слово abstract предотвращает его прямое создание, поскольку имеют значение только конкретные реализации... и там можно использовать общие методы, как если бы они были в одном классе; по крайней мере, пока область применения protected.

Martin Zeitler 20.03.2019 17:12

@MartinZeitler, это не решает исходную проблему, так как мне тогда нужно будет определить LevelOne levelOne при ссылке на него из общего кода в MainActivity?

James 20.03.2019 17:15

@ Джеймс, тебе не нужно определять все сразу, это бесполезно. просто добавьте private BaseLevelFragment currentLevel, который может содержать ссылку на текущий экземпляр, независимо от того, класс ли это LevelOne или LevelTwo. большая часть кода в MainActivity — это плохой дизайн при использовании Fragment, который должен быть автономным.

Martin Zeitler 20.03.2019 17:18

@NormR, насколько я знаю, вы не можете использовать карту (или списки) для разных классов, только внутри класса

James 20.03.2019 17:19

Другие вопросы по теме