2011-04-22 2 views
1

내 게시물의 성격이 떨어져 버릴 것입니다.필드 중 하나가 메소드 인 Java 클래스가 있습니까?

필요한 경우 프로그래머가 쉽게 확장 할 수있는 메서드 집합이 포함 된 클래스를 만들어야합니다. 나는 두 클래스가 있다고 생각했다 : CommandsCommand. CommandsCommand 오브젝트의 배열을 포함하며 프로그래머가 새로운 명령을 추가 할 수있는 곳입니다. 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

이 작업을 통해 달성하려는 전반적인 목표는 무엇입니까? –

+0

여러 명령이 있으며 사용자는 "execute name_of_command"를 입력하여 명령을 실행할 수 있습니다. 명령은 Commands 클래스에 정의 될 것입니다. – Andrew

답변

3

Java에 함수 포인터가 없습니다. 이는 일반적인 트릭입니다.

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

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

많은 감사. 도움이되었습니다. – Andrew

5

내가 사용하려는 생각 Command pattern :

객체 지향 프로그래밍에서

의 명령 패턴은 객체가 를 대표하고 필요한 모든 정보 를 캡슐화하는 데 사용됩니다 의 디자인 패턴입니다 나중에 메서드를 호출하는 방법 시간

위키 백과 페이지에는 예제가 있습니다.

Commandexecute 방법의 인터페이스 여야합니다. 프로그래머는 Command 인터페이스를 구현하는 클래스를 코딩 할 수 있으므로 필요한 작업을 수행하려면 execute 메서드를 구현해야합니다. 그런 다음 Command[] 배열을 가질 수 있으며 각 Command 객체에 대해 execute을 호출하여 작업을 수행 할 수 있습니다.

+0

많은 감사합니다. 그게 큰 도움이되었고, 나는 그것이 효과가 있다고 생각합니다. 이제는 명령의 이름을 지정하여 "execute name_of_command"를 입력하여 명령을 실행할 수 있어야합니다. HashMap을 사용하여 이름과 명령을 저장하려고합니다.나는 어떻게 가는지 보자 – Andrew

+0

당신을 진심으로 환영합니다! 'Map'을 사용하여 사용자 친화적 인 명령 이름을 해당'Command' 객체와 연관시키는 것이 좋습니다. – MarcoS

1

Java에 함수 포인터가 없으므로 작동하지 않습니다. 당신이하고 싶은 것은 구체적인 서브 클래스에 구현하는 execute() 메소드를 가지고있는 인터페이스입니다.

스타일 문제이지만 일반적으로 명령 구현에는 이름 필드가 없습니다. 오히려 각 명령의 이름을 보유하는 Map<String, Command>을 작성합니다.

+0

편집 : 제안대로지도 사용에 문제가 있었지만 현재 작동 중입니다. 감사! – Andrew

1

Java에서 메소드를 직접 전달할 수는 없습니다. 대신 공통 인터페이스를 구현하는 객체 여야합니다. 예를 들어, 메소드는 Runnable 인터페이스를 구현하는 객체가 될 수 있습니다. 그런 다음 메서드를 사용해야 할 때 "실행"을 호출합니다.

관련 문제