Указатель геометрических функций - PullRequest
1 голос
/ 04 января 2012

Я делаю своего рода командное приложение для рисования геометрических фигур. Поэтому, если пользователь вводит что-то вроде RECT 100, 50, 200, 120, я рисую прямоугольник в указанном месте на панели рисования.

Так что для этого мне нужно отобразить RECT на g.drawRect(100, 50, 200, 120); и все подобные функции для рисования геометрических фигур.

Я буду использовать хеш-карту для отображения, но я не знаю, как построить массив функций в Java. В C ++ я сделал это, хотя.

Ключ может быть 'RECT', а значение - смещение индекса.

Пожалуйста, покажите мне, как я могу индексировать эти функции. Или есть еще лучший способ решить основную проблему?

Ответы [ 2 ]

5 голосов
/ 04 января 2012

В Java нет указателей на функции, вам нужно делать это через наследование и / или интерфейсы. Вот пример:

interface Shape {
    void draw(int[] data);
}

class Polygon implements Shape {
    public void draw(int[] data) {
        // Draw polygon using points data[i], data[i+1] for points
    }
}

class Circle implements Shape {
     public void draw(int[] data) {
         // Draw circle using data[0], data[1] for the center, and data[2] for radius
     }
}

В конструкторе вашей основной программы или статическом инициализаторе:

Map<String,Shape> shapes = new HashMap<String,Shape>();
shapes.put("POLY", new Polygon());
shapes.put("CIRC", new Circle());

В вашем коде рисунка:

shapes.get("CIRC").draw(new int[] {100, 100, 50});
3 голосов
/ 04 января 2012

Я должен признать, что я не совсем понял ваш дизайн, я не уверен, зачем вам нужен массив функций, как вы сказали, но именно так это можно сделать в Java.

Поскольку функция (метод в терминах Java) не является «первоклассным объектом» в Java, вы не можете создать массив методов (по крайней мере, в Java 7).Вместо этого вы можете использовать более объектно-ориентированный подход - определить интерфейс, каждый метод будет реализацией интерфейса (класса), так что вы сможете хранить массив реализации интерфейса.Я бы использовал шаблон проектирования Command вместо массива методов или чего-то еще ... Надеюсь, это поможет

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