2011-04-22 183 views
1

我对Java很新,因为我的文章的性质将给予有一个Java类,其中一个字段是一个方法?

我需要创建一个类,其中包含一组方法,如果需要它可以轻松地由程序员扩展。我想过有两类:CommandsCommandCommands包含一个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; 
    } 
} 

我知道有很多事情错,但我卡上找到合适的方式。提示/帮助将是太棒了。

+3

你试图用这个来实现的总体目标是什么? – 2011-04-22 11:57:30

+0

会有很多命令,用户可以通过输入“execute name_of_command”来执行它们。命令将在命令类 – Andrew 2011-04-22 14:47:23

回答

3

Java没有函数指针。这是一个常见的技巧:

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

public void createCommands() { 
    commands.add(new Command(){ 
     @Override 
     void execute() { 
     something.move(); 
     } 
    }); 
} 
+0

非常感谢。这很有帮助。 – Andrew 2011-04-22 14:50:07

5

我想你想使用的Command pattern

在面向对象的编程, 命令模式是一个对象来表示 和封装所需的所有信息 在 设计模式在稍后调用方法 时间

维基百科页面有一个示例。

您的Command应该是与execute方法的接口。程序员可以编写一个实现Command接口的类,因此她/他必须实现execute方法来执行所需的操作。然后您可以有一个Command[]阵列,并且对于每个Command对象,您只需拨打execute即可执行该任务。

+0

中定义非常感谢。这是一个很大的帮助,我认为这是有效的。现在唯一的事情是我需要能够命名这些命令,以便用户可以通过键入“execute name_of_command”来执行它们。我试图使用一个HashMap来存储名称和命令。我会看看我如何去 – Andrew 2011-04-22 14:48:58

+0

不客气!使用'Map'将用户友好的命令名称与相应的'Command'对象关联起来是个不错的主意。 – MarcoS 2011-04-22 14:54:56

1

Java没有函数指针,所以这不起作用。你可能想要做的是有一个命令接口与​​方法,你在具体的子类实现。

这是一个风格问题,但我通常在Command实现中不会有名称字段。相反,我会创建一个包含每个命令名称的Map<String, Command>

+0

编辑:我有一个使用地图的问题,因为你建议,但我想我现在工作。谢谢! – Andrew 2011-04-22 14:50:43

1

请注意,您不能直接传递有关Java的方法。相反,他们需要是实现通用接口的对象。例如,您的方法可能会成为实现Runnable接口的对象。然后,当您需要使用该方法时,您只需调用“运行”。

相关问题