0

Inventory オブジェクトを持つ Character オブジェクトを作成しています。Inventory オブジェクトには InventoryItem オブジェクトのリストがあり、すべての InventoryItem オブジェクトには Item オブジェクトがあります。

キャラクター <= インベントリ <= 複数のインベントリ アイテム <= アイテム

私の問題はアイテムにあります。Item は複数のタイプにすることができます。すべてのタイプには独自のプロパティがあります。したがって、私のデータベースでは、Item、WeaponItem、ArmorItem、UseableItem、TrashItem、QuestItem、および AccesoryItem というテーブルを取得しました。すべてのアイテム タイプ テーブルには、それらをアイテムにリンクするための ItemId があります。

私の質問は: Item クラスに異なるタイプのアイテムを実装するにはどうすればよいですか?

私が考えたのは、各タイプのフィールド/プロパティを作成し、アイテムの現在のタイプを除いてすべてを 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

必要に応じて追加情報を追加できます。

編集:継承。それを忘れる私は愚かです。

そこで、アイテム クラスを継承する各タイプのクラスを作成します。それから私の質問は今これに変わります:

inventoryItem アイテムのリストを使用してキャラクター インベントリを作成すると。使用するアイテム タイプ クラスを指定するには、データベース内にアイテムの itemType プロパティを作成するか、すべての itemType を含む ItemType テーブルを作成し、それを ID にリンクしてから、この itemType/itemTypeId を使用して使用するクラスを指定する必要がありますか? (スイッチケースを使用)または私が間違っていましたか?

質問がばかげている場合は申し訳ありませんが、私は少し遅いです。:(

4

3 に答える 3

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が言ったように、継承はこの場合非常に便利です。Item クラスを、作成したい他のクラス (Weapon/Armor/etc) の基本クラスにします。

それ以外の場合、別の「安価な」解決策は、このクラスに ItemType の列挙型を追加することです。ただし、他のサブクラスのプロパティが多すぎる場合は、最後の 2 行を忘れて、いくつかのサブクラスを作成してください。

于 2013-05-17T15:40:27.237 に答える