在if / else中声明派生类而不重复基类字段

时间:2014-02-04 15:50:36

标签: c# inheritance

我目前正在尝试从json字符串中收到的数据填充字典。

我目前的做法:

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);
}

不幸的是,这不会编译,因为我在if / else语句中声明了'item'。

如果没有为每个项目类型定义基类字段,有没有办法做到这一点?

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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);
}