Как заставить класс принимать другой тип дочерних классов (другого родительского класса) в конструкторе в java - PullRequest
1 голос
/ 15 марта 2020

Я много борюсь с этим, поэтому, пожалуйста, go легко для меня, поскольку я все еще новичок во всем этом.

У меня есть класс Player, и одним из параметров, который он принимает, является Location. Однако теперь я столкнулся с проблемой, которую я не знаю, как решить. Я создал несколько дочерних классов Location, таких как HotelRoom и HotelKitchen, и мне нужно иметь возможность доступа к методам дочерних классов из созданного объекта Player.

Теперь я не могу просто изменить конструктор Игрока, чтобы он принимал HotelRoom, поскольку расположение персонажей может измениться на HotelKitchen.

Класс игрока:

public class Player {
    private int health;
    private int cluesLeft; //1 clue per level 
    private String name;
    private Location currentRoom;

public Player(String name, int health, int cluesLeft, Location currentRoom) {
    this.setHealth(health); 
    this.setCluesLeft(cluesLeft);
    this.setName(name);
    this.setCurrentRoom(currentRoom);
}

/**
 * @return the health
 */
public int getHealth() {
    return health;
}

/**
 * @param health the health to set
 */
public void setHealth(int health) {
    this.health = health;
}

/**
 * @return the cluesLeft
 */
public int getCluesLeft() {
    return cluesLeft;
}

/**
 * @param cluesLeft the cluesLeft to set
 */
public void setCluesLeft(int cluesLeft) {
    this.cluesLeft = cluesLeft;
}

/**
 * @return the name
 */
public String getName() {
    return name;
}

/**
 * @param name the name to set
 */
public void setName(String name) {
    this.name = name;
}   

/**
 * @return the currentRoom
 */
public Location getCurrentRoom() {
    return currentRoom;
}

/**
 * @param currentRoom the currentRoom to set
 */
public void setCurrentRoom(Location currentRoom) {
    this.currentRoom = currentRoom;
}
}

Класс местоположения

import java.util.Scanner;

/**
 *
 * @author User
 */
public class Location {
    static Scanner scan = new Scanner(System.in);
    private String locationImage; // string holds the ASCII map
    private String locationName;
    private String[] itemImages;

public Location(String locationName, String locationImage, String[] itemImages) {
    this.setLocationName(locationName);
    this.setLocationImage(locationImage);
    this.setItemImages(itemImages);
}

/**
 * @return the locationImage
 */
public String getLocationImage() {
    return locationImage;
}

/**
 * @param locationImage the locationImage to set
 */
public void setLocationImage(String locationImage) {
    this.locationImage = locationImage;
}

/**
 * @return the locationName
 */
public String getLocationName() {
    return locationName;
}

/**
 * @param locationName the locationName to set
 */
public void setLocationName(String locationName) {
    this.locationName = locationName;
}

public void printLocationMap() {
    try {
        Thread.sleep(1500);
    } catch (Exception e) {
        System.out.print(e);
    }
    System.out.println(this.getLocationImage());
}

public String retrieveSpecificItem(int item){
    String[] array = this.getItemImages();

    for (int x = 0; x < array.length; x++) {
        if (item == (x + 1)) {
            return array[x];
        }
        else {
            return null;
        }
    }
    return null;
}

/**
 * @return the itemImages
 */
public String[] getItemImages() {
    return itemImages;
}

/**
 * @param itemImages the itemImages to set
 */
public void setItemImages(String[] itemImages) {
    this.itemImages = itemImages;
}

Одно из дочерних классов местоположений

import java.util.Scanner;

/**
 *
 * @author User
 */
public class HotelRoom extends Location {

Scanner scan = new Scanner(System.in);

public HotelRoom(String locationName, String locationImage, String[] itemImages) {
    super(locationName, locationImage, itemImages);

}

public static String instructions(Player gameCharacter) {
    boolean loopDone = false;
    String choice = "";

     do {
         String menu = "What would you like to do next?\n"+ 
                   "1.) Move to Kitchen\n"+ 
                   "2.) Inspect PC\n"+
                   "3.) Inspect Cupboard\n"+ 
                   "4.) Inspect bed\n"
                 + "5.) Guess who did it!";


    int userChoice = JavaApplication2.checkInput(menu);

    switch(userChoice) {
        case 1: 
            choice = "HotelKitchen";
            loopDone = true;
            break;
        case 2: 
            System.out.println(this.retrieveSpecificItem(0));
            break;
        case 3: 
            System.out.println(this.retrieveSpecificItem(1));
            break;
        case 4: 
           System.out.println(this.retrieveSpecificItem(2));
            break;
        case 5: 
            choice = "Choose";
            break;
     } 


}while (loopDone == false);

    return choice;
} 
}

Ниже приведен метод в моем классе ApplicationTester (который имеет основной), который создает объект местоположения, который затем устанавливается как параметр

public static Location setLocations(int whichRoom) {
    Location locations = null;


        String room = ("|----------|   [1]   |----------|\n"+
                      "| [CUPBOARD]             [PC]   |\n"+
                      "|               P               |\n"+
                      "|                               |\n"+
                      "|             [BED]             |\n"+
                      "|             |   |             |\n"+
                      "|             | X |             |\n"+
                      "|             |___|             |\n"+
                      "|-------------------------------|\n");

        String kitchen = ("|----------|   [1]   |----------|\n"+
                          "| [FRIDGE]              [OVEN]  |\n"+
                          "|               P               |\n"+
                          "|                               |\n"+
                          "|        [SERVING TABLE]        |\n"+
                          "|                               |\n"+
                          "|           [TABLES]            |\n"+
                          "|                               |\n"+
                          "|-------------------------------|\n");
        if (whichRoom == 1) {
            Location hotelRoom = new Location("Hotel Room", room, allItems(1));
            locations = hotelRoom;
        }
        else {
            Location hotelKitchen = new Location("Hotel Kitchen", kitchen, allItems(2));
            locations = hotelKitchen;
        }

        return locations;

}

Метод allitems (число), который используется вышеописанным методом

public static String[] allItems(int area) {
        String pc = "\n" +
                    "             ____________________________________________________\n" +
                    "            /                                                    \\\n" +
                    "           |    _____________________________________________     |\n" +
                    "           |   |                 ___________________         |    |\n" +
                    "           |   |                |                   |        |    |\n" +
                    "           |   |   DuckDuckGo - |How to remove stain|        |    |\n" +
                    "           |   |                |___________________|        |    |\n" +
                    "           |   |                                             |    |\n" +
                    "           |   |                                             |    |\n" +
                    "           |   |                                             |    |\n" +
                    "           |   |   Removing stains from any surface          |    |\n" +
                    "           |   |                                             |    |\n" +
                    "           |   |   Getting rid of stains in 3 steps          |    |\n" +
                    "           |   |                                             |    |\n" +
                    "           |   |   Choosing the right stain remover          |    |\n" +
                    "           |   |                                             |    |\n" +
                    "           |   |_____________________________________________|    |\n" +
                    "           |                                                      |\n" +
                    "            \\\\_____________________________________________________/\n" +
                    "                   \\\\_______________________________________/\n" +
                    "                _______________________________________________\n" +
                    "             _-'    .-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  --- `-_\n" +
                    "          _-'.-.-. .---.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.--.  .-.-.`-_\n" +
                    "       _-'.-.-.-. .---.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-`__`. .-.-.-.`-_\n" +
                    "    _-'.-.-.-.-. .-----.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-----. .-.-.-.-.`-_\n" +
                    " _-'.-.-.-.-.-. .---.-. .-----------------------------. .-.---. .---.-.-.-.`-_\n" +
                    ":-----------------------------------------------------------------------------\n" +
                    "`---._.-----------------------------------------------------------------._.---";

    String cupboard = "     __________\n" +
                      "   /          /|\n" +
                      " /__________/  |\n" +
                      " |________ |   |\n" +
                      " /_____  /||   |\n" +
                      "|\".___.\"| ||   |\n" +
                      "|_______|/ |   |\n" +
                      " || .___.\"||  /\n" +
                      " ||_______|| /\n" +
                      " |_________|/\n"; 

    String bed = "                     __.--'|\n" +
                 "              ___.---'      |\n" +
                 "      ___.---'              |\n" +
                 " _.--'              \\\\\\     |\n" +
                 " |                  XX |    |\n" +
                 " |                  U. '    |\n" +
                 " J                  __=__   |\n" +
                 "  L               /          |\n" +
                 "  L              / /|.  .|     -`-.\n" +
                 "  |              | ||____|      __.>-._\n" +
                 "  |              | ||    |__.--'       `--._\n" +
                 "  J-._ _____.---------'                    `--.__\n" +
                 "  J   `-<_                                    `-.__\n" +
                 "   L      `-.                                     _>-.\n" +
                 "   +.        `-._                          ___.--'   |\n" +
                 "   | `-._        `-._                __.--'          |\n" +
                 "         `-._        `-.       __.--'            _.--'\n" +
                 "             `-._       `-._.-'             _.--'    |\n" +
                 "                 `-.       |           _.--'\n" +
                 "                    `-.    |      _.--'\n" +
                 "                       `-. | _.--'\n" +
                 "                          `|'\n" +
                 "                           |";

    String sink = "   ___\n" +
                  "                     .' _ '.\n" +
                  "                    / /` `\\ \\\n" +
                  "                    | |   [__]\n" +
                  "                    | |    {{\n" +
                  "                    | |    }}\n" +
                  "                 _  | |  _ {{\n" +
                  "     ___________<_>_| |_<_>}}________\n" +
                  "         .=======^=(___)=^={{====.\n" +
                  "        / .----------------}}---. \\\n" +
                  "       / /                 {{    \\ \\\n" +
                  "      / /                  }}     \\ \\\n" +
                  "     (  '========================='  )\n" +
                  "      '-----------------------------'";

    String couch = ".----.\n" +
                    "                  |    |\n" +
                    "                  |____|\n" +
                    "   _.-------------._()_.-------------._\n" +
                    "  / |             | )( |             | \\\n" +
                    "  | |             | () |             | |\n" +
                    "  _\\|_____________| )( |_____________|/_\n" +
                    ".=. /             /(__)\\             \\ .=.\n" +
                    "|U|/_____________/______\\_____________\\|U|\n" +
                    "| |====================================| |\n" +
                    "| |                                    | |\n" +
                    "|_|LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLlc|_|";

    String bin = " _.,-----/=\\-----,._\n" +
                 " (__ ~~~\"\"\"\"\"\"\"~~~ __)\n" +
                 "  | ~~~\"\"\"\"\"\"\"\"\"~~~ |\n" +
                 "  | |  ; ,   , ;  | |\n" +
                 "  | |  | |   | |  | |\n" +
                 "  | |  | |   | |  | |\n" +
                 "  | |  | |   | |  | |\n" +
                 "  | |  | |   | |  | |\n" +
                 "  | |  | |   | |  | |\n" +
                 "  | |  | |   | |  | |\n" +
                 "  | |  | |   | |  | |\n" +
                 "  |. \\_| |   | |_/ .|\n" +
                 "   `-,.__ ~~~ __.,-'\n" +
                 "         ~~~~~";

    String[] hotelRoom = {pc, cupboard, bed};
    String[] hotelKitchen = {bin, couch, sink};

    if (area == 1) {
        return hotelRoom;
    } else if (area == 2) {
        return hotelKitchen;
    } else if (area == 3) {
        return null; //not set up yet
    } else if (area == 4){
        return null; //not set up yet
    } else {
        return null; //not set up yet
    }
}

Теперь я вижу, что некоторые люди предлагают интерфейсы / абстрактные классы, и я благодарю вас за ввод, но все еще запутался по двум причинам ,

Во-первых, метод в main, называемый setLocation, может возвращать только местоположение, теперь после определения местоположения Аннотация позволит ли мне вернуть любой класс, являющийся дочерним по отношению к местоположению?

И наконец, аналогично Ситуация, как указано выше. Если расположение сделано Абстрактным, примет ли конструктор Player какой-либо дочерний класс расположения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...