Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Создание класса с универсальным хранилищем объектов любых классов наследников базового класса

PND Studio Ученик (156), на голосовании 1 год назад
Как создать класс, который хранит в себе hashmap объектов всех классов наследников общего класса, условно, Item. От этого класса экстендятся классы любых предметов, у которых могут даже быть разные методы. Чисто использовать полиморфизм не вариант, так как нужно приводить типы или знать сколько всего разных классов было создано. А как создать универсальное хранилище без знаний о количестве классов наследников? Например, инвентари или сундуки в игре, по идее, должны хранить любые классы-наследники
Голосование за лучший ответ
AaacoB Aaac Мудрец (14203) 1 год назад
Быстрое решение в день обращения
Александр Искусственный Интеллект (301635) 1 год назад
в чём именно проблема?
если у тебя в классе уже есть hashmap объектов типа Item, то чё тебе ещё нужно?
куда приводить? к супперклассу? нафига? объекты и так будут знать чё они из себя представляют...
а посчитать? ну, так делай hashmap для счётчиков конкретных типов...
PND StudioУченик (156) 1 год назад
Если добавлять объекты типов наследников, то они приводятся к типу, в котором организовано хранилище. В данном случае, Item
Professional Professional Мудрец (15955) 1 год назад
Для создания универсального хранилища, которое может содержать объекты любых классов-наследников базового класса (например, `Item`), можно использовать `Map<Class<? extends Item>, List<Item>>`. Это позволит хранить объекты каждого из наследников `Item` в отдельном списке, и по классу можно будет быстро определить, где хранятся объекты этого класса.

Давайте рассмотрим пример:

```java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map ;

class Item {
// Основные свойства и методы класса Item
}

class Weapon extends Item {
// Свойства и методы класса Weapon
}

class Armor extends Item {
// Свойства и методы класса Armor
}

class UniversalStorage {
private Map<Class<? extends Item>, List<Item>> storage = new HashMap<>();

public <T extends Item> void addItem(T item) {
storage
.computeIfAbsent(item.getClass(), k -> new ArrayList<>())
.add(item);
}

public <T extends Item> List<T> getItems(Class<T> cls) {
return (List<T>) storage.getOrDefault(cls, new ArrayList<>());
}
}

public class Main {
public static void main(String[] args) {
UniversalStorage storage = new UniversalStorage();

storage.addItem(new Weapon());
storage.addItem(new Armor());
storage.addItem(new Armor());

System.out.println(storage.getItems(Weapon.class).size()); // 1
System.out.println(storage.getItems(Armor.class).size()); // 2
}
}
```

Здесь `UniversalStorage` использует хэш-карту для хранения объектов каждого из классов-наследников `Item`. Вы можете легко добавлять объекты в хранилище с помощью метода `addItem` и извлекать их с помощью метода `getItems`, передавая класс объектов, которые вы хотите получить.

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