2017-01-22 8 views
0

Javaでテキストアドベンチャーを作っています。私は "ミッションボード"を作ろうとしています。ここで使えるミッションを見ることができますが、他のクラスのメソッドを変数でどのように呼び出すべきかはわかりません。私はこのようなものを試した:入力パラメータに基づいて異なるクラスのメソッドを呼び出す

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) 
} 

すべてのクラス名は "クエスト" +番号と呼ばれます。

+0

私はJavaでプログラミングしています –

+0

あなたは一歩前進し、いくつかのJavaチュートリアルをスキップしたいかもしれません。あなたが '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 

関連する問題