Полиморфизм Java - получение дочерней команды из родительской карты - PullRequest
0 голосов
/ 13 сентября 2018

Я сделал два класса - Building и Warehouse.Warehouse расширяется Building.Я создал карту Building (building_map), где я поместил Building объекты и Warehouse объекты.Я хотел бы получить метод Warehouse с помощью карты, но я могу видеть только то, что относится к классу Building.

building_map.get(ware_id);   /*--Warehouse_function--*/;

(Это одно из моих первых сообщений, извинитеесли я поставил слишком мало информации о своей проблеме)

РЕДАКТИРОВАТЬ: Вот как я добавляю объекты на карту:

        public static Map<String, Building> building_map = new HashMap<>();

Building bD_02 = new Building("bD_02", 2, "Duargian", 2.5, 180, 450, 100, ""
                + "i0_024!i0_029!i0_036?90!10!10!" //upgrade lv 1
                + "&" 
                + "" //upgrade lv 2
                + "&" 
                + "" //upgrade lv 3
                + "&");

Building bD_03 = new Warehouse("bD_03", 3, "Duargian", 2.8, 800, 2500, 1500, 2.35, 3000, ""
                + "i0_021!i0_024!i0_029?200!500!70!" //upgrade lv 1
                + "&" 
                + "" //upgrade lv 2
                + "&" 
                + "" //upgrade lv 3
                + "&");

    building_map.put("bD_02", bD_02);                      
    building_map.put("bD_03", bD_03);                      

РЕДАКТИРОВАТЬ2: Спасибо, TungstenX!Это сработало, теперь я могу закрыть тему.

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Значения на карте соответствуют типу здания, поэтому тип возвращаемого объекта - тип здания.Если вы, как разработчик, знаете, что конкретный ключ привязан к хранилищу, то введите его на склад.((Склад) building_map.get ("bD_03"))

0 голосов
/ 13 сентября 2018

Если у вас есть карта Building с, не каждый объект должен иметь Warehouse.Это также может быть Building или другая реализация.

Если вы уверены , что это склад, то вы можете разыграть его следующим образом:

Map<String, Building> map = new HashMap<>();
map.put("b", new Building());
map.put("w", new Warehouse());

Warehouse w = (Warehouse) map.get("w");
w.yourMethod();

но имейте в виду, что кто-то может поместить еще один экземпляр потомка Bulding, например

class OtherClass extends Building {}
map.put("b", new Building());
map.put("w", new Warehouse());
map.put("o", new OtherClass());

Warehouse w = (Warehouse) map.get("b");  // ClassCastException
Warehouse w = (Warehouse) map.get("o");  // ClassCastException

PS: Как предложил @Przemyslaw Kruglej, если вы хотите проверить реализацию класса вобщая коллекция (например, карта) во время выполнения , которую вы можете использовать instanceof до приведения:

Building possibleWarehouse = map.get("w");
if (possibleWarehouse instanceof Warehouse) { // true
    Warehouse warehouse = (Warehouse) possibleWarehouse;
}
0 голосов
/ 13 сентября 2018

Вы можете разыграть результат попадания на склад, предполагая, что вы расширили склад с помощью здания. Т.е. class Warehouse extends Building

А ваша карта выглядит так: Map<String, Building> buildingMap = new HashMap<>(); Тогда вы можете сделать

Обновление: Безопасное литье

Building building = buildingMap.get("A");
if (building instanceof Warehouse) {
    ((Warehouse)building).warehousMethod();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...