Прошу простить мою паршивую терминологию!связь между классами в java
Я уже некоторое время борется с проблемой.
Я создаю игровой движок в java, где постоянно сталкиваюсь с той же проблемой. Я получил эту иерархию классов:
PARENT -> РЕБЕНОК -> Grandchild
где РОДИТЕЛИ владеют и строит ребенок, и так далее.
Теперь родитель имеет возможность делать вещи, которые должны выполнять как дети, так и дети. Допустим, что GRANDCHILD - это кнопка в графическом интерфейсе, а PARENT - игра CORE. Если кнопка нажата, я хочу приостановить игру. Кнопка/GRANDCHILD не имеет возможности сделать это сама, но нужно сделать это через PARENT/CORE.
РОДИТЕЛЕЙ -> РЕБЕНОК -> Grandchild + пауза игры() + что-то делать()
у меня есть три решения этой проблемы, ни один, который удовлетворяет меня.
- Возвращаемые значения. PARENT/GAME-CORE считает, что мышь нажата, звонит CHILD, который вызывает GRANDCHILD. GRANDCHILD подтверждает, что он был нажат и возвращает int или перечисление в PARENT/CORE. PARENT/CORE использует и case/if-else, чтобы определить, что нужно сделать.
РОДИТЕЛЕЙ INT: нажмите() -> РЕБЕНОК INT: нажмите() -> GRANCHILD INT: нажмите()
функция РОДИТЕЛЕЙ
switch(CHILD.click(){
case 1 do this;
case 2: do that;
etc.
}
Это решение, которое я ненавижу большинство. Мне не только нужно отслеживать ints/enums, но мне также нужно использовать switch/if-else, когда я могу использовать полиморфизм для получения более чистого кода.
Я думаю, что этот метод называется обратным вызовом. По построению PARENT отправляет внутренний класс/набор функций, передаваемый в конструктор GRANDCHILD. GRANDCHILD сохраняет этот внутренний экземпляр класса и вызывает его методы, когда это необходимо.
класс РОДИТЕЛЬ {
детский ребенок;
РОДИТЕЛЬ() { child = new CHILD (новый контроллер); }
класс Controller {
общественного аннулируются нажмите() { делать вещи ... }
}
}
Это нормально, но Безразлично Не чувствую себя хорошо. У gamecore могут быть сотни ДЕТЕЙ, и это означает сотню внутренних классов, функции которых могут делать более или менее то же самое.Занятия становятся огромными, когда игра растет. Это также создает циклы в иерархии, и я чувствую, что это плохо.
- Я думаю, что это называется «услуги». PARENT/GAMECORE является публичным. Любой класс может ссылаться на свои методы. Ну, в случае: PARENT-> CHILD-> GRANDCHILD, оба РОДИТЕЛЯ и РЕБЕНКА должны быть общедоступными, так как GRANDCHILD нуждаются как в методах ДЕТЕЙ, так и в РОДИТЕЛЯХ. Это не слишком хорошо.
Я мог бы жить с этим, если бы было только несколько классов, которые должны были быть доступны. Проблема в том, что мне нужно общение все время, почти все!
Так что я могу сделать? Я что-то пропустил, а если нет, то что из вышеперечисленного является лучшей практикой и спасет меня от будущих головных болей?
Значит, нет большой техники, которую я пропустил, что может освободить меня от моей тоски? – Jake
Не так далеко, насколько я знаю. Другим возможным способом может быть передача какого-то основного объекта с помощью методов, и этот основной объект содержит «публичные» дети других основных объектов. Таким образом, вы избавитесь от одиночек. 'public void update (Core c) {c.Input.getInput(); ...}' – Loki