2017-01-22 1 views
0

자바에서 textadventure를 만들고 "임무 게시판"을 만들려고합니다. 거기에 사용 가능한 임무를 볼 수 있지만 변수를 사용하여 다른 클래스의 메서드를 어떻게 호출해야하는지 모르겠습니다. 나는 이와 같은 것을 시도했다 :입력 매개 변수를 기반으로 다른 클래스의 메서드 호출

int quest[] = new int[20]; 
int i = 0; // running variable 

if (quest1Done == false) { 
    quest[i] = 1; 
} 
switch (br.readLine()) { 
    case "1": Quest+quest[0]+.run(); //this should run the method run() in the class Quest + variable (in that case 1) 
} 

모든 클래스 이름은 "Quest"+ 숫자라고 불린다.

+0

자바로 프로그래밍 해요 –

+0

뒤로 물러나서 자바 튜토리얼을 훑어보기 바란다. 만약 당신이'Quest'의 인스턴스를 가지고 있고'run()'이 매개 변수를 취하면'theQuest.run (quest [0]) '이 될 것입니다. 그렇지 않으면 실행하려는 메소드에 대한 세부 사항을 제공해야합니다. –

+0

@RedBaron 이것을 달성하기 위해 반사를 사용하거나 다형성을 이용할 수 있습니다. – CKing

답변

1

당신은 QuestRunner라는 인터페이스를 정의하여 시작하고 모든 Quest 클래스가이 인터페이스와 run 방법을 구현해야합니다 수 있습니다 : 이제 선 존재에 따라 동적으로 메소드를 호출하는 2 가지 옵션이 있습니다

public interface QuestRunner { 
    public void run(); 
} 

을 파일에 :

1. 반사

당신이 기반에 대한 객체를 생성하는 방법을 만들기 클래스의 완전한 이름 :

public void runQuest(String className) { 
    try { 
      Class classDefinition = Class.forName(className); 
      Object obj = classDefinition.newInstance(); 
      if(obj instanceof QuestRunner) { ((QuestRunner)obj).run(); 
     } catch (InstantiationException e) { 
      System.out.println(e); 
     } catch (IllegalAccessException e) { 
      System.out.println(e); 
     } catch (ClassNotFoundException e) { 
      System.out.println(e); 
     } 

    } 

2. 런타임 다형성

당신은 줄 번호 주어진 적절한 QuestRunner 구현을 반환하는 방법을 가질 수

:

public static QuestRunner createQuestRunner(String lineNum) { 
    QuestRunner questRunner = null; 
    if(lineNumber.equals("1")) { questRunner = new Quest1() } 
    else if(lineNumber.equals("2")) { ..... } 
    return questRunner; 
} 

당신은 할 수 있습니다 이 메서드에 lineNumber를 전달하고 run 메서드를 호출하면됩니다.

QuestRunner questRunner = createQuestRunner(br.readLine()); 
questRunner.run(); 

참고 : 위의 솔루션을 사용하는 경우 더 이상 스위치 케이스가 필요하지 않습니다.

+0

비슷한 해결책을 찾았지만 노력에 감사드립니다. –

+0

@RedBaron 좋습니다. 이 경우 나는 나의 대답이 정확하다고 믿는다. 그래서 그것을 받아 들여 다른 사람이 이것이 해결책이라는 것을 알기 위해 upvote한다. 우리는 당신이 알고있는 감사에 대한 답을 제공하지 않습니다 :) – CKing

0

제 조언은 코드 구조에 대해 생각하는 것입니다. 당신이하려는 것은 올바르지 않습니다. 당신이 성취하고자하는 것의 선택적인 버전은 다음과 같습니다 :

  • 빌드하려는 게임의 인스턴스가 있습니다.
  • 저장합니다. 퀘스트가있는 ArrayList에있는 임무가
  • "실행 중"입니다. 을 실행하려는 퀘스트의 매개 변수 ID를 얻는 인스턴스가 실행되고 실행됩니다. 다음 작업을 수행 할 수있는 예에서

:

당신이 당신의 프로그램에서 기대하는 기능을 수행 할 수있는 방법의 단지 슈퍼 기본적인 생각
Game mGame = new Game(Quest a, Quest b, Quest c); // In the game constructor you add these quests to your ArrayList 
mGame.run(1); // runs quest with id = 1 

.

관련 문제