1. База данных товаров
Я провожу инвентаризацию с помощью C #. Обычно я пишу программы на Python, и поэтому у меня есть некоторые проблемы с дизайном со статически типизированным C #. Из-за отсутствия практики.
Я создал простую базу данных предметов. У меня общий класс Item
. У него есть общие свойства, такие как id
, 'name' ... И для создания новых типов объектов я наследую от класса Item
. Например Weapon
элемент. Вот код
Item.cs
public class Item {
public string id;
public string name;
public string prefab;
public string icon;
public virtual string getTooltipText() {
return "";
}
}
Weapon.cs
public class Weapon : Item {
public int damage;
public override string getTooltipText() {
return "damage: " + damage;
}
}
Как вы можете видеть, каждый раз, когда мне нужно создать новый тип объекта, мне нужно создать новый класс, унаследованный для Item
Все элементы я загружаю в словарь, и он отлично работает
public Dictionary<string, Item> Items = new Dictionary<string, Item>();
И создать класс элемента с точки зрения типа элемента из файла базы данных
2. Часть вопроса. Инвентарь
Прямо сейчас я хочу создать инвентарь, используя мою базу данных предметов из первой части этого вопроса. Все предметы имеют общие свойства в пользовательском инвентаре. Например - количество и ссылка на элемент из базы данных элементов. Но главная проблема в том, что у многих предметов есть свои уникальные характеристики. Например, долговечность, скорость, качество и т. Д.
Как я могу спроектировать предмет инвентаря?
Первая идея
Первая идея (и она уродливая) - создать БОЛЬШОЙ класс со всей статистикой для всех типов объектов.
public class InventoryItem {
//main properties
public Item item;
public int quantity;
//all properties for all other items
public int durability;
public int speed;
public string quality;
public string magic;
...
}
И я должен заполнить нулем и null все неиспользуемые свойства с точки зрения типа элемента. Это уродливо, и мне не нравится такой способ создания класса InventoryItem
Вторая идея
Как и в моей базе данных элементов, я могу создать отдельный класс для каждого типа элемента инвентаря: InventoryWeapon, InventoryPlant, InventorySpells и т. Д.
И он выглядит лучше, чем класс BIG BOSS SINGLE InventoryItem.
Но у меня такое чувство, что я что-то делаю не так. Я делаю двойную работу. Каждый раз, когда мне нужно создать новый тип объекта, я должен создать новый Item в базе данных элементов (например, public class Plant : Item
), и мне нужно создать новый InventoryItem (например, public class InventoryPlant : InventoryItem
)
Мой вопрос: как лучше всего создать иерархию объектов для прототипа инвентаря?
Лучший дизайн?
А может что я делаю не так?
Или моя идея с классом для каждого типа - правильный способ инвентаризации?