使用此对象类的方法

时间:2013-05-17 15:26:20

标签: c# sql-server database class object

我正在创建一个具有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来告诉使用哪个类? (使用开关盒)或者我弄错了?

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

3 个答案:

答案 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添加枚举。但是,如果您的其他子类具有太多属性,请忘记最后两行并创建一些子类。