Объявить производный класс в if/else без повторения полей базового класса
В настоящее время я пытаюсь заполнить словарь из данных, которые я получаю из строки 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.
Есть ли способ сделать это без определения полей базового класса для каждого типа элемента?
Ответы
Ответ 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);
}
Ответ 2
Чтобы построить ответ на davisoa, но все равно не требует отбрасывания: помните, вы можете иметь более одной ссылки на объект. Yay, полиморфизм!
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);
}