Лучший способ создать иерархию объектов для прототипа инвентаря

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 )

Мой вопрос: как лучше всего создать иерархию объектов для прототипа инвентаря?

Лучший дизайн?

А может что я делаю не так?

Или моя идея с классом для каждого типа - правильный способ инвентаризации?


person cyberlis    schedule 03.05.2016    source источник


Ответы (1)


«Лучший» дизайн может оказаться недостижимым. Все, что вы можете сделать, это разработать что-то, что работает, и попытаться сделать это лучше.

При определении того, подходит ли композиция или наследование, подумайте в терминах, если является, а имеет. Является InventoryItem элементом? Или у него есть элемент?

Если вы проектируете элементы каждого типа независимо друг от друга, имеют ли они общие свойства, которым может способствовать базовый класс? Делает ли это InventoryItem более универсальным, поэтому вам не нужно InventoryWeapon и т. Д.?

Я делаю двойную работу.

Чем InventoryWeapon отличается от InventoryItem? Это просто потому, что он содержит предметы другого типа? Или есть свойства и методы, специфичные для этого типа? Можете ли вы использовать универсальные шаблоны (например, InventoryItem<TItem>) для улучшения строгой типизации и повторного использования кода? Да, вы можете получить связанные классы, такие как InventoryWeapon, но если это лучший дизайн, чем альтернатива, вероятно, стоит приложить дополнительные усилия.

На такие вопросы можно ответить, только набросав дизайн, увидев, что работает, а что нет, и попробовав разные вещи. У вас не получится сделать это с первого раза, поэтому выбор состоит в том, чтобы разобраться с тем, что у вас есть, или сделать шаг назад и сделать что-то другое.

person D Stanley    schedule 03.05.2016