为库存原型创建对象层次结构的最佳方式

The best way to create object hierarchy for inventory prototype

1。物品数据库

我正在用 C# 做库存。通常我用 python 编写程序,这就是为什么我在使用静态类型的 c# 时遇到一些设计问题。因为缺乏实践。

我创建了简单的项目数据库。我有一个将军classItem。它具有一般属性,如 id、'name'... 为了制作我从 Item class 继承的新对象类型。例如 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;
  }
}

如您所见,每次我需要创建新类型的对象时,我都需要创建新的 class 继承给 Item

我将所有项目加载到词典中,效果非常好

public Dictionary<string, Item> Items = new Dictionary<string, Item>();

并根据数据库文件中的项目类型创建项目class

2。问题部分。库存

现在我想使用这个问题第一部分的项目数据库创建一个清单。所有项目在用户清单中都具有通用属性。例如 - quantity 并从 Item 数据库引用 item。但主要问题是许多物品都有自己独特的统计数据。例如耐用性速度质量

如何设计库存项目?

第一个想法

第一个想法(它很丑陋)是用所有类型的对象的所有统计数据创建大 class

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;
  ...
}

而且我必须用 zeronull 填充所有未使用的项目类型属性。 它很丑,我不喜欢这种制作 InventoryItem class

的方式

第二个想法

就像在我的物品数据库中一样,我可以为每个库存物品类型创建单独的 class:InventoryWeaponInventoryPlantInventorySpells

而且比BIG BOSS SINGLE好看InventoryItem class.

但是我感觉我做错了什么。我在做双重工作。每次我需要创建新类型的对象时,我都必须在项目数据库中创建新的 Item(例如 public class Plant : Item)并且我必须创建新的 InventoryItem(例如public class InventoryPlant : InventoryItem

我的问题是:为库存原型创建对象层次结构的最佳方式?

最佳设计?

或者我做错了什么?

或者我对每种类型 class 的想法是进行库存的正确方法吗?

"best" 设计可能无法实现。你所能做的就是设计一些有效的东西,并努力让它更好

在确定组合或继承是否合适时,请考虑是否 是一个 并且 有一个 InventoryItem 是一个项目吗?还是项?

如果您设计的每种类型的项目彼此独立,它们是否具有可以通过基础 class 实现的共同属性?这是否使 InventoryItem 更通用,因此您不需要 InventoryWeapon 等?

I am making double work.

InventoryWeaponInventoryItem 有何不同?仅仅是因为它包含不同类型的项目吗?或者是否有特定于该类型的属性和方法?您可以使用泛型(例如 InventoryItem<TItem>)来改进强类型和代码重用吗?是的,您最终可能会得到像 InventoryWeapon 这样的耦合 classes,但如果它是比替代方案更好的设计,那么它可能值得付出额外的努力。

此类问题只能通过草拟设计、查看哪些有效、哪些无效并尝试不同的方法来回答。你不会第一次就把它做好,所以接下来的选择是用你拥有的东西来努力,或者退后一步,做一些不同的事情。