2013-05-17 51 views
0

我正在創建一個具有Inventory對象的Character對象。在Inventory對象中,您獲得了InventoryItem對象的列表,並且在每個InventoryItem對象中都有一個Item對象。哪種方法可以製作這個對象類

字< =庫存< =多inventoryItem < =項目

我的問題是與項目。一個項目可以是多種類型。每種類型都有自己的屬性。所以在我的數據庫中我得到了thoses表:Item,WeaponItem,ArmorItem,UseableItem,TrashItem,QuestItem和AccesoryItem。每個項目類型表都有一個ItemId將它們鏈接到Item。

我的問題是:如何實現我的項目類的不同類型的項目?

我想到了正在爲每種類型的字段/屬性,並將它們全部設置爲空,除了當前類型的項目是什麼。 (也可能加入一個表的ItemType並將其添加到類字段/屬性)

我想到了正在爲每種類型的類,做上述相同,但與對象本身另一件事。

這是做這件事的好方法還是更好?

這裏是我當前的項目類代碼:

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告訴哪個類使用? (使用開關盒)還是我弄錯了?

很抱歉,如果問題是愚蠢的,我有點慢。 :(

+3

你需要學習繼承。 – emd

+2

只是一個提示,如果你不知道:你可以聲明像這樣的屬性'公衆int ItemId {獲取;組; }'。通過創建一個私有字段並在'get'和'set'運算符中訪問它,它就像你的屬性一樣起作用。這爲您節省了大量的輸入。 – Wutz

+0

爲什麼你有這麼多的物品表?他們有不同的屬性嗎?你不會在你的代碼片段中顯示它們。你能分享表格的細節嗎? – Tombala

回答

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 
} 
+0

是的,這就是我要做的。我編輯了我的問題,因爲我需要澄清一些事情。 – snaplemouton

+0

@snaplemouton - 最簡單的方法是創建一個類型爲enum的類型,併爲每個類型賦值,並將該枚舉的int值作爲字段存儲在數據庫中。 – Bobson

+0

如果按照@Bobson的建議,我還會向基類中添加一個抽象屬性,該屬性在派生類中實現時會返回與派生類型相對應的類型的'enum'中的值。這樣做會避免需要投射Item對象以確定其類型。 –

0

就像@emd說,繼承是在這種情況下非常有用的。你讓你的項目類的基類要創建的(武器/防具/等)。

否則,其他類的,另一個「更便宜」的解決辦法是在這個類中添加枚舉的ItemType的。但是,如果你的其他子類有太多的屬性,忘記這些最後兩行,並創建一些子類。

1

由於您的項目類型數量有限,因此我會避免創建項目類型表並將事情簡單化。在您的庫存項目中,您會指向一個項目。

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

如果您需要檢查的具體項目類型,你可以有一個枚舉或者你可以簡單地檢查具體類型:

if(inventoryItem.Item is ArmorItem) 
{ 
    // Maybe you allow this item to be worn 
} 
相關問題