Java - создание массива методов
Я разрабатываю текстовую приключенческую игру для школьного прогресса. У меня есть каждый "уровень", настроенный как класс, и каждая исследуемая область (node) как метод в соответствующем классе.
Что мне нужно, это код для перехода от одного node к другому. Поскольку каждый node подключен к четырем другим узлам, я должен повторить чрезвычайно похожий блок кода в каждом методе.
Что я предпочел бы сделать, это включить массив методов в начале каждого node, например:
public static void zero()
{
... adjacentNodes[] = {one(), two(), three(), four()};
}
И затем отправьте этот массив в общий метод и попросите его отправить плеер вправо node:
public static void move(...[] adjacentNodes, int index)
{
adjacentNodes[index];
}
Я упростил свой код, но это общая идея. Возможно ли это?
Ответы
Ответ 1
Всякий раз, когда вы думаете о указателе на функцию, вы переводите на Java, используя шаблон адаптера (или вариант). Это будет примерно так:
public class Node {
...
public void goNorth() { ... }
public void goSouth() { ... }
public void goEast() { ... }
public void goWest() { ... }
interface MoveAction {
void move();
}
private MoveAction[] moveActions = new MoveAction[] {
new MoveAction() { public void move() { goNorth(); } },
new MoveAction() { public void move() { goSouth(); } },
new MoveAction() { public void move() { goEast(); } },
new MoveAction() { public void move() { goWest(); } },
};
public void move(int index) {
moveActions[index].move();
}
}
Ответ 2
Просто у ваших узлов есть объекты, которые все придерживаются одного и того же интерфейса, тогда вы сможете надежно называть их методы.
Ответ 3
Так как Java не имеет понятия методов как первоклассных сущностей, это возможно только с использованием отражения, которое является болезненным и подверженным ошибкам.
Лучшим приближением, вероятно, было бы иметь уровни как перечисления с реализацией метода для каждого экземпляра метода:
public enum Level1 implements Explorable{
ROOM1 {
public void explore() {
// fight monster
}
}, ROOM2 {
public void explore() {
// solve riddle
}
}, ROOM3 {
public void explore() {
// rescue maiden
}
};
}
public interface Explorable{
public abstract void explore();
}
public static void move(Explorable[] adjacentNodes, int index)
{
adjacentNodes[index].explore();
}
Однако это немного злоупотребляет концепцией enum. Я бы не использовал его для серьезного проекта.
Ответ 4
У вашего дизайна есть фундаментальные недостатки. Обычный дизайн OO будет иметь каждый "уровень" как объект (класса "уровень" или что-то в этом роде). каждая "исследуемая область" также будет объектом, содержащимся внутри объекта уровня - возможно, класса ExplorableArea. "Изучаемые области" могут быть разных видов, и в этом случае вы делаете их разными подклассами ExplorableArea.
Ответ 5
Попробуйте подумать о решениях без отражения. Например, перечисления.
Ответ 6
Вы можете использовать класс Reflection для создания массива методов.
http://java.sun.com/developer/technicalArticles/ALT/Reflection/