Я пытаюсь реализовать игру в стиле монополии на Java в рамках школьного проекта, но столкнулся с проблемой, которую не могу решить или, похоже, нашел ответ на свой вопрос. Проблема в том, что я получаю исключение classCastException в своем коде, думаю, я выяснил, почему я его получаю (я изначально пытался привести тип Property
к переменной newPosition
ниже), но теперь мне нужно чтобы найти способ реализовать код, чтобы я мог его избежать.
Проблема в том, что у меня есть суперкласс Square
, который имеет 3 возможных подкласса Property
, Go
и FreeParking
. Я храню свою доску в виде ArrayList, но мне нужен доступ к методам, относящимся к Property
объектам, для расчета арендной платы и т. Д. Как я могу получить доступ к этим методам, если при обращении к свойству из ArrayList оно имеет тип Square
.
Заранее извиняюсь, если это не имеет особого смысла.
public abstract class Square {
private String name;
private boolean isAvailable;
private Player owner;
//getters and setters
}
public class Property extends Square{
private String colour;
private int buyHouset;
private int rent1House;
private int rent2House;
private int rent3House;
private int rentHotel;
private int numHouses;
private int rent;
private int price;
//getters and setters
}
public static void takeTurn(Player player, Dice die, ArrayList<Square> board) {
System.out.println(player.getGamertag() + "'s turn");
//get value from roll of die
int move = askToRoll();
String gamertag = player.getGamertag();
//if player does not quit continue with turn
if(move > 0) {
//get player current position and add roll of die
int newSpaceIndex = player.getPosition() + move;
//if players new position exceeds the array of squares, return to 0 index and add remainder
//add credits for passing Go
//else update position
if (newSpaceIndex > 11) {
player.setPosition(newSpaceIndex - 12);
Go.passGoAction(player);
}else {
player.setPosition(newSpaceIndex);
}
if(player.getPosition() == 1) {
Square newPosition = board.get(player.getPosition());
System.out.println(gamertag + " new position " + newPosition.getName());
}else if(player.getPosition() == 6) {
FreeParking.freeParkingAction();
} else {
Square newPosition = board.get(player.getPosition());
System.out.println("____________________");
System.out.println("Land on " + newPosition.getName());
if(newPosition.getOwner() != null) {
Player owner = newPosition.getOwner();
/* *****THIS IS WHERE THE ERROR IS STEMING FROM*****
*THE newPosition.getRent() method can not be accessed as newPosition
*is defines as Square
*/
System.out.println(owner.getGamertag() + " demands you pay " + newPosition.getRent() + " credits!");
}else {
System.out.println("What would you like to do now? ...\n"
+ "1. Buy property\n"
+ "2. End turn");
int input = in.nextInt();
boolean valid = false;
do {
switch(input) {
case 1:
System.out.println("You now own controlling stock of " + newPosition.getName());
player.setOwnsProperty(newPosition);
newPosition.setOwner(player);
valid = true;
break;
case 2:
System.out.println("Ending turn");
valid=true;
break;
default:
System.out.println("Invalid input, please select one of the options 1-2");
valid = false;
break;
}
}while(!valid);
}
}
}
System.out.println("END TURN: " + player);
System.out.println();
}