0

我正在创建一个具有 Inventory 对象的 Character 对象。在 Inventory 对象中,您有一个 InventoryItem 对象列表,在每个 InventoryItem 对象中,您都有一个 Item 对象。

字符 <= 库存 <= 多个库存项目 <= 项目

我的问题是项目。一个项目可以是多种类型。每种类型都有自己的属性。所以在我的数据库中,我得到了这些表:Item、WeaponItem、ArmorItem、UseableItem、TrashItem、QuestItem 和 AccesoryItem。每个项目类型表都有一个 ItemId 以将它们链接到项目。

我的问题是:如何为我的 Item 类实现不同类型的项目?

我想到的是为每种类型创建一个字段/属性,并将它们全部设置为 null,除了项目的当前类型。(也可能添加一个表 ItemType 并将其添加到类 Field/Property)

我想到的另一件事是为每种类型创建一个类,并与上述相同,但使用对象本身。

那会是做这件事的好方法还是有更好的方法?

这是我当前的项目类代码:

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

如果需要,我可以添加任何其他信息。

编辑:继承。忘记这件事我是愚蠢的。

所以我为继承我的项目类的每种类型创建类。然后我的问题现在变成了:

当我使用它的 inventoryItem 项目列表创建我的角色库存时。要告诉使用哪个项目类型类,我是否必须在我的数据库中为我的项目创建一个 itemType 属性,或者为每个 itemType 创建一个 ItemType 表,然后将它与一个 id 链接,然后使用这个 itemType/itemTypeId 来告诉使用哪个类?(使用开关盒)还是我弄错了?

对不起,如果问题很愚蠢,我有点慢。:(

4

3 回答 3

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
}
于 2013-05-17T15:43:03.167 回答
1

由于您的项目类型数量有限,我会避免创建项目类型表并保持简单。在您的库存项目中,您将指向一个项目。

public class InventoryItem
{
    public Item item { get; set; }
}

如果你需要检查特定的项目类型,你可以有一个枚举,或者你可以简单地检查具体类型:

if(inventoryItem.Item is ArmorItem)
{
    // Maybe you allow this item to be worn
}
于 2013-05-17T15:47:15.193 回答
0

就像@emd 所说,在这种情况下继承会非常有用。你让你的项目类成为你想要创建的其他类的基类(武器/盔甲/等)。

否则,另一个“更便宜”的解决方案是在此类中为 ItemType 添加一个枚举。但是,如果您的其他子类有太多属性,请忘记最后两行并创建一些子类。

于 2013-05-17T15:40:27.237 回答