2013-05-17 5 views
0

인벤토리 개체가있는 Character 개체를 만듭니다. Inventory 객체에는 InventoryItem 객체의 목록이 있고 모든 InventoryItem 객체에는 Item 객체가 있습니다.이 개체 클래스를 만드는 방법

문자 < = 재고 < = 여러 InventoryItem의 < = 항목

내 문제는 항목에 있습니다. 항목은 여러 유형이 될 수 있습니다. 모든 유형마다 고유 한 속성이 있습니다. 그래서 내 데이터베이스에는 Items, WeaponItem, ArmorItem, UseableItem, TrashItem, QuestItem 및 AccesoryItem 테이블이 있습니다. 모든 항목 유형 테이블에는 ItemId가있어 항목을 항목에 연결합니다.

제 질문은 : 항목 클래스에 다른 유형의 항목을 어떻게 구현합니까?

내가 생각한 것은 각 유형에 대해 Field/Property를 만들고 현재 유형의 항목을 제외하고 모두 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 Item을 사용하십시오. 어떤 아이템 타입 클래스를 사용할지를 알려면, 데이터베이스에 itemType 속성을 item 또는 itemType 테이블과 함께 생성해야만합니까? itemType과 함께 링크 한 후이 itemType/itemTypeId를 사용하여 사용할 클래스를 지정하십시오. (스위치 케이스 사용) 잘못 했나요?

죄송합니다. 질문이 어리석은 짓이라면 조금 느립니다. @emd는 상속이 경우에 매우 유용 할 것이라고 말했다 것처럼 :(

+3

당신은 상속을 배울 필요가있다. – emd

+2

모르겠다면, 힌트를 주자. 다음과 같은 속성을 선언 할 수있다.'public int ItemId {get; 세트; }'. 이것은 private 필드를 생성하고'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. 
} 

아이템 객체를 사용하여, 당신은 이런 유형의 확인하실 수 있습니다 :

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 '타입을 생성하고, 그 enum의'int' 값을 데이터베이스의 필드로 저장하는 것입니다. – Bobson

+0

@Bobson과 같이하는 경우 기본 클래스에 추상 속성을 추가합니다. 기본 클래스는 파생 클래스에 구현되면 파생 된 유형에 해당하는 유형의 'enum'에서 값을 반환합니다. 이렇게하면 Item 객체를 형변환하여 해당 유형을 결정할 필요가 없습니다. –

0

은. 당신은 당신의 Item 클래스는 그렇지 않은 경우 (무기/갑옷/등).

을 만들려는 다른 클래스의 기본 클래스 만들기 , 또 다른 "더 싼"해결책은이 클래스에 ItemType에 대한 열거 형을 추가하는 것입니다. 그러나 다른 하위 클래스의 속성이 너무 많으면 마지막 두 줄을 잊어 버리고 하위 클래스를 만듭니다.

1

항목 유형이 제한되어 있으므로 항목 유형 테이블을 만들지 않고 간단하게 유지할 수 있습니다. 재고 품목에서 품목을 가리 킵니다. 특정 항목 유형을 확인해야 할 경우

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

, 당신은 열거를 가질 수 또는 당신은 단순히 구체적인 유형 확인할 수 있습니다 :

if(inventoryItem.Item is ArmorItem) 
{ 
    // Maybe you allow this item to be worn 
} 
관련 문제