Java - Создание массива методов - PullRequest
16 голосов
/ 25 ноября 2010

Я разрабатываю текстовую приключенческую игру для школьного прогресса. У меня каждый «уровень» настроен как класс, а каждая исследуемая область (узел) - как метод внутри соответствующего класса.

Что мне мешает, так это код для перехода с одного узла на другой. Поскольку каждый узел связан с четырьмя другими узлами, я должен повторить чрезвычайно похожий блок кода в каждом методе.

Что бы я предпочел сделать, так это включить в начало каждого узла массив методов, например:

public static void zero()
{
    ... adjacentNodes[] = {one(), two(), three(), four()};
}

А затем отправьте этот массив в общий метод, и пусть он отправит проигрыватель на правильный узел:

public static void move(...[] adjacentNodes, int index)
{
    adjacentNodes[index];
}

Я упростил свой код, но это общая идея. Это возможно?

Ответы [ 6 ]

52 голосов
/ 26 ноября 2010

Всякий раз, когда вы думаете о указателе на функцию, вы переводите на 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();
    }
}
6 голосов
/ 25 ноября 2010

Если ваши узлы будут объектами, которые все привязаны к одному и тому же интерфейсу, вы сможете надежно вызывать их методы.

5 голосов
/ 26 ноября 2010

Поскольку в 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.Я бы не стал использовать его для серьезного проекта.

2 голосов
/ 25 ноября 2010

Ваш дизайн имеет фундаментальные недостатки. Обычный ОО-проект должен иметь каждый «уровень» как объект (класса «уровень» или что-то в этом роде). каждая «исследуемая область» также будет объектом, содержащимся в объекте уровня - возможно, класса ExplorableArea. «Исследуемые области» могут быть разных видов, и в этом случае вы делаете их разными подклассами ExplorableArea.

0 голосов
/ 25 ноября 2010

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

0 голосов
/ 25 ноября 2010

Вы можете использовать класс Reflection для создания массива методов.http://java.sun.com/developer/technicalArticles/ALT/Reflection/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...