为库存原型

时间:2016-05-03 12:45:03

标签: c# oop design-patterns class-hierarchy

1。物品数据库

我用c#制作库存。通常我用python编写程序,这就是为什么我有一些静态类型c#的设计问题。由于缺乏实践。

我创建了简单的Item数据库。我有一个普通班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。问题部分。库存

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

如何设计库存项目?

第一个想法

第一个想法(而且很丑陋)是创建包含所有类型对象的所有统计数据的BIG类

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

的方法

第二个想法

就像在我的Item数据库中一样,我可以为每个库存项目类型创建单独的类: InventoryWeapon InventoryPlant InventorySpells 等。

它看起来比BIG BOSS SINGLE InventoryItem 类好。

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

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

最好的设计?

或者也许我做错了什么?

或者我对每种类型的课程的想法是做库存的正确方法吗?

1 个答案:

答案 0 :(得分:2)

“最佳”设计可能无法实现。您所能做的就是设计工作的东西并尝试使其更好

在确定组合或继承是否合适时,如果并且具有,则用术语来思考。 InventoryItem是一个项目吗?或者它有一个项?

如果您将每种类型的项目彼此独立地设计,它们是否共享可由基类促成的共同属性?这是否会使InventoryItem更通用,因此您不需要InventoryWeapon等?

  

我正在做双重工作。

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

这些问题只能通过草拟设计,查看哪些有效,哪些无效以及尝试不同的事情来回答。你不是第一次就把它弄好了,所以选择的是选择你所拥有的东西,或者退后一步,做些不同的事情。