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

Попробуйте подумать о решениях без отражения. Например, перечисления.