2017-01-22 4 views
0

Я делаю textadventure на 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 метод:

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

Вы можете затем просто передайте номер строки этому методу и вызовите метод run:

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

Примечание: Вам больше не нужен чехол для переключения, если вы используете вышеуказанные решения.

+0

Я нашел аналогичное решение, но спасибо за ваши усилия :) –

+0

@RedBaron Это здорово. В этом случае я считаю, что мой ответ правильный, поэтому примите его и повысьте, чтобы другие пользователи знали, что это решение. Мы не даем ответы за то, что вы знаете :) – CKing

0

Мой совет - подумать о структуре вашего кода. То, что вы пытаетесь сделать, неверно. Дополнительная версия того, что вы пытаетесь выполнить, будет:

  • У вас есть экземпляр игры, которую вы пытаетесь построить.
  • Вы храните. ваши миссии в ArrayList с вашим заданием
  • У вас есть метод «run» в игре. экземпляр, который получает как идентификатор параметра квеста, который вы хотите выполнить , запускает и выполняет его.

В этом примере вы можете сделать следующее:

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 

Это просто супер основная идея о том, как вы можете достичь функциональности вы ожидаете от вашей программы.