2012-01-04 3 views
1

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

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

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

Ключ может быть «RECT» и значением смещения индекса.

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

ответ

5

В 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}); 
+0

Ничего себе, мои проблемы, похоже, испарились! Это самый элегантный фрагмент кода, который я мог бы получить! –

+0

@VinayakGarg Теперь я думаю, что исправил синтаксические ошибки тоже :) Я не писал Java уже более 3 лет, поэтому синтаксис C# прокрался в мои объявления. – dasblinkenlight

+0

неважно! Моя IDE позаботится о синтаксических ошибках :) Я больше озабочен логикой. –

3

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

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

+0

Да, это помогает. Благодаря! Наверное, мне понадобится такая помощь, чтобы расширить знания Java. –

+0

Если они ** не удалили ** функции Java в Java 7, то вы ** можете ** создать массив методов, используя ** Reflection **. (http://docs.oracle.com/javase/tutorial/reflect/member/methodInvocation.html) Я не думаю, что это хороший способ подойти к проблеме на Java, но я хотел бы указать, что это может быть сделано таким образом. –

Смежные вопросы