Наличие класса Java, где одно из полей является методом? - PullRequest
1 голос
/ 22 апреля 2011

Я довольно новичок в Java, так как характер моего поста откажется

Мне нужно создать класс, который содержит набор методов, которые могут быть легко расширены программистом, если это потребуется. Я думал о двух классах: Commands и Command. Commands содержит массив объектов Command, и здесь программист может добавлять новые команды. Класс Command имеет два поля. Имя класса и подпись метода. Я не уверен, как это можно сделать. В C, я думаю, вы можете иметь структуру функций, поэтому мы можем иметь класс, где экземпляры класса являются методами? Или я совершенно не на том пути?

Я думал о попытке сделать что-то вроде этого:

public class Commands
{
    private ArrayList<Command> commands;

    /**
     * Constructor for objects of class Command
     */
    public Commands()
    {
        createCommands();
    }

    /**
     * This is where a programmer can add new commands
     */
    public void createCommands()
    {
        commands.add(new Command("move", public void move()));
    }

    /**
     * This is where the programmer can define the move command
     */
    public void move()
    {
        ....
    }
}

public class Command
{
    private String command_name;
    private Method command;

    public Command(String command_name, Method command)
    {
        this.command_name = command_name;
        this.command = command;
    }
}

Я знаю, что с этим много чего не так, но я застрял в поиске правильного пути. Советы / помощь будут фантастическими.

Ответы [ 4 ]

5 голосов
/ 22 апреля 2011

Я думаю, что вы хотите использовать шаблон Command :

В объектно-ориентированном программировании шаблон команды является шаблоном проектирования в какой объект используется для представления и инкапсулировать всю информацию необходимо вызвать метод позже время

На странице Википедии есть пример.

Ваш Command должен быть интерфейсом с методом execute. Программист может кодировать класс, который реализует интерфейс Command, и поэтому он / она должен реализовать метод execute, чтобы сделать то, что нужно. После этого вы можете иметь массив Command[], и для каждого объекта Command вы можете просто вызвать execute для выполнения задачи.

3 голосов
/ 22 апреля 2011

Java не имеет указателей на функции.Это распространенный трюк:

abstract class (or interface) Command {
  void execute();
}

public void createCommands() {
  commands.add(new Command(){ 
      @Override
      void execute() {
        something.move();
      }
    });
}
1 голос
/ 22 апреля 2011

Обратите внимание, что вы не можете напрямую передавать методы в Java. Вместо этого они должны быть объектами, которые реализуют общий интерфейс. Например, ваши методы могут стать объектами, которые реализуют интерфейс Runnable. Тогда вы просто вызываете «run», когда вам нужно использовать метод.

1 голос
/ 22 апреля 2011

В Java нет указателей на функции, поэтому это не работает.То, что вы, вероятно, хотите сделать, это иметь интерфейс Command с методом execute(), который вы реализуете в конкретных подклассах.Имя поля в реализации команд.Скорее, я бы просто создал Map<String, Command>, который содержит имя для каждой команды.

...