Создание массива объектов с производными классами

Я пытаюсь создать двух игроков в программе, которую пишу. Проблема в том, что есть три типа игроков, которые могут быть созданы, но чтобы ссылаться на них позже, я хочу, чтобы они были названы как игрок один и игрок два. Три класса: «Человек», «Компьютер» и «Карен» являются производными от класса «Игрок». Мне интересно, как создать массив Player, в который я могу затем поместить объекты player1 и player2. Возможно ли это сделать?

int playerType = 0;
int highestScore = 0;
Player[] player = new Player[2]; // This is the array of type Player, the master class

Scanner userInput = new Scanner (System.in);

for (int i = 1; i < 3; i++)
{
    System.out.println ("Choose a type of player:");
    System.out.println ("1: Human");
    System.out.println ("2: Computer (Threshold = 20)");
    System.out.println ("3. Computer (Custom)");
    System.out.print ("? : ");

    playerType = Integer.valueOf(userInput.nextLine()); // gets input choice from user


  switch (playerType)
    {
      case 1:
        Human player[i] = new Human();
      case 2:
        Computer player[i] = new Computer();
      case 3:
        Karen player[i] = new Karen();
    }

}

Есть еще один метод, который я пробовал, используя оператор if для создания объекта playerOne или playerTwo в зависимости от того, на какой итерации цикла for мы были (i). К сожалению, похоже, что java не скомпилирует его, потому что существует несколько объявлений одной и той же переменной, хотя должно выполняться только одно из объявлений.

if(playerNumber == 1){
  switch (playerType)
    {
      case 1:
        Human playerOne = new Human();
      case 2:
        Computer playerOne = new Computer();
      case 3:
        Karen playerOne = new Karen();
    }
}

if(playerNumber == 2){
  switch (playerType)
    {
      case 1:
        Human playerTwo = new Human();
      case 2:
        Computer playerTwo = new Computer();
      case 3:
        Karen playerTwo = new Karen();
    }
}

Решение, предложенное OldProgrammer, приведено ниже, оно сработало отлично. Однако теперь у меня возникла проблема с вызовом методов: Human, Computer и Karen. Я получаю следующую ошибку при попытке выполнить:

System.out.println(player[i].getName() + ", your turn");

Сообщение об ошибке:

Main.java:38: error: cannot find symbol
    System.out.println(player[i].getName() + ", your turn");
                                ^
symbol:   method getName()
location: class Player
1 error

Метод в каждом классе выглядит так:

public class Karen extends Player {
private String playerName = "Karen";

public String getName(){
  return playerName;
}

}


person Brayton Larson    schedule 06.10.2019    source источник
comment
Изменить человека player[i] = new Human(); to player[i] = new Human(); и т. д.   -  person OldProgrammer    schedule 06.10.2019
comment
@OldProgrammer Хорошо, это сработало. Теперь у меня возникают проблемы с вызовом методов из отдельных классов. Например, если я делаю player[i].getName(), который должен вызывать этот метод в: Human, Computer или Karen. Однако я получаю следующую ошибку: ошибка: не удается найти символ System.out.println(player[i].getName() + , ваша очередь); ^   -  person Brayton Larson    schedule 06.10.2019
comment
@OldProgrammer Я добавил то, что имею в виду в вопросе. Это должно быть более ясно.   -  person Brayton Larson    schedule 06.10.2019


Ответы (1)


Благодаря OldProgrammer:

Изменить «Игрок-человек[i] = новый человек();» на «player[i] = new Human();» и т. д.

Понимание того, как производные классы действительно важны, и я рад, что именно так это работает. Большое спасибо, и я надеюсь, что это может помочь кому-то в будущем. Вот мой обновленный код для полного разъяснения:

int highestScore = 0;
Player[] player = new Player[2]; 

Scanner userInput = new Scanner (System.in);

for (int i = 0; i < 2; i++)
{
    System.out.println ("Choose a type of player:");
    System.out.println ("1: Human");
    System.out.println ("2: Computer (Threshold = 20)");
    System.out.println ("3. Computer (Custom)");
    System.out.print ("? : ");

    playerType = Integer.valueOf(userInput.nextLine());

  switch (playerType)
    {
      case 1:
        player[i] = new Human();
      case 2:
        player[i] = new Computer();
      case 3:
        player[i] = new Karen();
    }

}
person Brayton Larson    schedule 06.10.2019