我正在创建一个具有Inventory对象的Character对象。在Inventory对象中,您有一个InventoryItem对象列表,并且在每个InventoryItem对象中都有一个Item对象。
字符< =库存< =多个inventoryItem< = Item
我的问题在于物品。 Item可以是多种类型。每种类型都有自己的属性。所以在我的数据库中我得到了表:Item,WeaponItem,ArmorItem,UseableItem,TrashItem,QuestItem和AccesoryItem。每个项目类型表都有一个ItemId将它们链接到Item。
我的问题是:如何在Item类中实现不同类型的项目?
我想到的是为每种类型创建一个Field / Property并将它们全部设置为null,除了项目的当前类型。 (也可以添加表ItemType并将其添加到类Field / Property中)
我想到的另一件事是为每种类型制作一个类,并按照上面的方式进行操作,但使用对象本身。
这是做这件事的好方法还是更好?
这是我当前的Item类代码:
public class Item
{
#region Fields
//=======================================================================================
private int itemId;
private string itemName;
private int itemLevel;
private int itemRarityId;
private int equipementSlotId;
private int statsId;
private Stats stats;
private string imageUrl;
private int equipementSlotSecondId;
private int itemWeight;
//=======================================================================================
#endregion
#region Properties
//=======================================================================================
public int ItemId
{
get
{
return itemId;
}
set
{
itemId = value;
}
}
public string ItemName
{
get
{
return itemName;
}
set
{
itemName = value;
}
}
public int ItemLevel
{
get
{
return itemLevel;
}
set
{
itemLevel = value;
}
}
public int ItemRarityId
{
get
{
return itemRarityId;
}
set
{
itemRarityId = value;
}
}
public int EquipementSlotId
{
get
{
return equipementSlotId;
}
set
{
equipementSlotId = value;
}
}
public int StatsId
{
get
{
return statsId;
}
set
{
statsId = value;
}
}
public Stats Stats
{
get
{
return stats;
}
set
{
stats = value;
}
}
public string ImageUrl
{
get
{
return imageUrl;
}
set
{
imageUrl = value;
}
}
public int EquipementSlotSecondId
{
get
{
return equipementSlotSecondId;
}
set
{
equipementSlotSecondId = value;
}
}
public int ItemWeight
{
get
{
return itemWeight;
}
set
{
itemWeight = value;
}
}
#endregion
#region Methods
//=======================================================================================
#endregion
#region Constructors
//=======================================================================================
public Item()
{
}
public Item(int pItemId)
{
ItemId = pItemId;
}
//=======================================================================================
#endregion
如果需要,我可以添加任何其他信息。
编辑:继承。我忘了这件事我很蠢。
所以我为继承我的item类的每个类型创建类。然后我的问题现在改为:
当我使用它的inventoryItem项目列表创建我的角色库存时。要告诉我要使用哪个项类型类,我是否必须在我的数据库中创建一个itemType属性到我的项或每个itemType的ItemType表然后用id链接它然后使用此itemType / itemTypeId来告诉使用哪个类? (使用开关盒)或者我弄错了?
对不起,如果问题很愚蠢,我有点慢。 :(
答案 0 :(得分:3)
根据emd的上述评论,您可以通过继承来实现这一点。创建一个抽象的答案类,您可以从中派生其他类。
// Base class from which all Item objects derive
public abstract class Item
{
public int ItemId { get; set; }
}
public class WeaponItem : Item
{
// Add properties specific to WeaponItem here.
}
public class ArmorItem : Item
{
// Add properties specific to ArmorItem here.
}
使用Item对象时,可以检查它的类型:
WeaponItem weaponItem = item as WeaponItem;
If (weaponItem != null)
{
// Do something relating to WeaponItem.
}
如果从数据库加载并假设您有一个标识项目类型的整数值:
switch (itemTypeId)
{
case 1:
new WeaponItem();
break;
case 2:
new ArmorItem();
break;
// Others
}
答案 1 :(得分:1)
由于您的项目类型数量有限,我会避免创建项目类型表并保持简单。在您的库存项目中,您将指向一个项目。
public class InventoryItem
{
public Item item { get; set; }
}
如果您需要检查特定的项目类型,可以使用枚举,或者只需检查具体类型:
if(inventoryItem.Item is ArmorItem)
{
// Maybe you allow this item to be worn
}
答案 2 :(得分:0)
就像@emd所说,继承在这种情况下非常有用。你使你的Item类成为你想要创建的其他类的基类(武器/护甲/等)。
否则,另一个“更便宜”的解决方案是在此类中为ItemType添加枚举。但是,如果您的其他子类具有太多属性,请忘记最后两行并创建一些子类。