【问题标题】:Call a method from different classes based on an input parameter根据输入参数从不同类调用方法
【发布时间】:2017-06-07 01:45:10
【问题描述】:

我正在用 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)
}

所有班级名称都称为“任务”+一个数字。

【问题讨论】:

  • 我正在用java编程
  • 您可能想退后一步,浏览一些 Java 教程。如果您有一个Quest 的实例,并且run() 带有一个参数,那么它将是theQuest.run(quest[0])。如果没有,那么您需要提供有关您尝试运行的方法的详细信息。
  • @RedBaron 您可以使用反射或利用多态性来实现这一点。
  • @DaveNewton OP想要根据输入动态调用方法。
  • 谢谢大家,我找到了办法。

标签: java arrays class variables call


【解决方案1】:

我的建议是考虑代码的结构。你试图做的是不正确的。您尝试完成的可选版本是:

  • 您有一个正在尝试构建的游戏实例。
  • 您存储。 您在 ArrayList 中的任务充满了您的 Quest
  • 您在游戏中有一个“运行”方法。 作为您想要的任务的参数 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

这只是关于如何实现程序所期望的功能的超级基本概念。

【讨论】:

    【解决方案2】:

    您可以从定义一个名为 QuestRunner 的接口开始,并确保您的所有 Quest 类都实现此接口和 run 方法:

    public interface QuestRunner { 
         public void run();
    }
    

    您现在有 2 个选项可以根据文件中存在的行动态调用方法:

    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();
    

    注意:如果您使用上述解决方案,则不再需要开关盒。

    【讨论】:

    • 我找到了类似的解决方案,但感谢您的努力:)
    • @RedBaron 太好了。在那种情况下,我相信我的回答是正确的,所以请接受它并投票让其他用户知道这是解决方案。我们不为您知道的感谢提供答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    相关资源
    最近更新 更多