2014-02-04 2 views
0

В настоящее время я пытаюсь заполнить словарь из данных, которые я получаю из строки json.Объявить производный класс в if/else без повторения полей базового класса

Мой текущий подход:

public class Item { 

    public class BaseItem { 
     public int id; 
     public int level; 
    } 

    public class Armor : BaseItem { 
     public int durability; 
    } 

    public class Weapon : BaseItem { 
     public int damage; 
    } 
} 

foreach (JsonObject jsonObject in jsonArray) { 
    if (jsonObject["armor"] != null) { 
     var item = new Item.Armor(); 

     item.durability = jsonObject["armor"]["durability"]; 
    } else if (jsonObject["weapon"] != null) { 
     var item = new Item.Weapon(); 

     item.damage = jsonObject["weapon"]["damage"]; 
    } else { 
     var item = new Item.BaseItem(); 
    } 

    item.itemID = jsonObject["id"]; 
    item.level = jsonObject["level"]; 

    Item.data.Add(item.itemID, item); 
} 

К сожалению, это не компилируется, потому что я объявляю «пункт» в если/другое заявление.

Есть ли способ сделать это без определения полей базового класса для каждого типа элемента?

ответ

1

Я бы объявил item за пределами ваших заявлений if.

foreach (JsonObject jsonObject in jsonArray) { 
    Item.BaseItem item;   

    if (jsonObject["armor"] != null) { 
     item = new Item.Armor(); 

     ((Item.Armor)item).durability = jsonObject["armor"]["durability"]; 
    } else if (jsonObject["weapon"] != null) { 
     item = new Item.Weapon(); 

     ((Item.Weapon)item).damage = jsonObject["weapon"]["damage"]; 
    } else { 
     item = new Item.BaseItem(); 
    } 

    item.itemID = jsonObject["id"]; 
    item.level = jsonObject["level"]; 

    Item.data.Add(item.itemID, item); 
} 
+0

Я уже пробовал это, но я получаю следующее сообщение об ошибке: «Тип' Item.BaseItem „не содержит определение для' прочности“, а метод расширения' долговечности»типа' Item.BaseItem 'можно найти " – silentneedle

+0

Затем вам нужно указать каждое конкретное использование дочерних свойств – davisoa

+0

Не могли бы вы привести пример? :) – silentneedle

1

Чтобы построить на ответ davisoa, но до сих пор не требует слепков: помните, что вы можете иметь более чем одну ссылку на объект. Я, полиморфизм!

foreach (JsonObject jsonObject in jsonArray) 
{ 
    Item.BaseItem item; 

    if (jsonObject["armor"] != null) 
    { 
     Item.Armor armor = new Item.Armor(); 
     armor.durability = jsonObject["armor"]["durability"]; 

     item = armor; 
    } 
    else if (jsonObject["weapon"] != null) 
    { 
     Item.Weapon weapon = new Item.Weapon(); 
     weapon.damage = jsonObject["weapon"]["damage"]; 

     item = weapon; 
    } 
    else 
    { 
     item = new Item.BaseItem(); 
    } 

    item.itemID = jsonObject["id"]; 
    item.level = jsonObject["level"]; 

    Item.data.Add(item.itemID, item); 
} 
+0

Вы, ребята, потрясающие, спасибо! – silentneedle

Смежные вопросы