我有一系列项目:
Item[] ItemsOut;
问题是我有一些派生类型Item
,如EquipItem
。他们也在这个阵列中。
AddItem
和Item
类都有EquipItem
个功能。
Inventory.AddItem(AllRecipes.Recipes[curPage].ItemsOut[i]......);
我的想法是,如果我的数组类型为Item[]
,那么它总是添加像普通Item
这样的项目。
我目前的解决方案正在运行,它是:
if (AllRecipes.Recipes[curPage].ItemsOut[i].GetType() == typeof(EquipItem))
{
Inventory.AddItem((EquipItem)AllRecipes.Recipes[curPage].ItemsOut[i], AllRecipes.Recipes[curPage].ItemsOut[i].number);
}
else
{
Inventory.AddItem(AllRecipes.Recipes[curPage].ItemsOut[i], AllRecipes.Recipes[curPage].ItemsOut[i].number);
}
但如果我有100500个子课程,我将被迫做100500 if
个陈述。
如何自动化?类似的东西:
Inventory.AddItem((AllRecipes.Recipes[curPage].ItemsOut[i].GetType())AllRecipes.Recipes[curPage].ItemsOut[i], AllRecipes.Recipes[curPage].ItemsOut[i].number);
或
Inventory.AddItem(AllRecipes.Recipes[curPage].ItemsOut[i] as AllRecipes.Recipes[curPage].ItemsOut[i].GetType(), AllRecipes.Recipes[curPage].ItemsOut[i].number);
我希望能够做到这样的事情:
Type t = AllRecipes.Recipes[curPage].ItemsOut[i].GetType();
Inventory.AddItem((t)AllRecipes.Recipes[curPage].ItemsOut[i].number);
但是当我需要将它用作类型时,它会导致“变量用作类型”错误。当然不是变数,而是它的价值。
答案 0 :(得分:1)
这里的想法应该是不要让任何事情知道Item
,EquipItem
(或任何旧的FooItem
)之间的区别。
如果它们都来自Item
并且数组的类型为Item[]
,则可以将这些子类添加到数组中而不会出现问题
var item = new Item();
var equip = new EquipItem(); // where EquipItem inherits from Item;
var array = new Item[]{ item,equipItem}; // no error here
如果你有一个AddItem
方法,它添加到这个数组并根据类型执行一些操作,那么调用代码也不应该知道关于类型的任何信息 - 也许是一些虚拟方法,当它执行一些操作时添加到列表中
public class Item
{
public virtual void AddedToList(){}
}
public class EquipItem
{
public override void AddedToList()
{
// behaviour specific to EquipItem
}
}
答案 1 :(得分:1)
首先,除非你有两个名为AddItem的方法(一个用于Item,另一个用于EquipItem),你不需要施放你的ItemsOut,只需使用
Inventory.AddItem(AllRecipes.Recipes[curPage].ItemsOut[i], AllRecipes.Recipes[curPage].ItemsOut[i].number);
其次,你不能这样做:
Type t = AllRecipes.Recipes[curPage].ItemsOut[i].GetType();
addItem((t)AllRecipes.Recipes[curPage].ItemsOut[i]
因为t
是类Type
的一个实例,所以只能使用(EquipItem) AllRecipes.Recipes[curPage].ItemsOut[i]
等类型名称进行投射
最后,除非您遇到性能问题,否则请不要尝试优化代码。这样做就是我们所说的Premature Optimization
因此,请检查您是否有方法AddItem(EquipItem equipItem)
。如果你不这样做,你就不需要检查它的类型并将物品投射到EquipItem。希望我能帮到你。
编辑我认为可以改进代码的最好的事情是清除它,如下所示:
var item = AllRecipes.Recipes[curPage].ItemsOut[i];
if (item is EquipItem)
{
Inventory.AddItem((EquipItem) item, item.number);
}
else
{
Inventory.AddItem(item, item.number);
}