Pat*_*tai 3 c# arrays foreach object
我正在学习编程,我不得不创建一个蛇游戏.
在游戏中,蛇有大约5种可能的消耗品,我决定把每个新的都Consumable放在一个Consumable阵列中.
现在我想foreach通过数组循环迭代并执行以下操作:
foreach (Apple apple in consumables)
{
renderer.DrawApple(apple);
}
Run Code Online (Sandbox Code Playgroud)
但是当数组中有不同的对象时,如a Apple和a SegmentRemover(这是可能的,因为它们从Consumable类中继承),那么编译器SegmentRemover也会迭代,我得到一个无效的强制转换异常.
我想,因为我在foreach循环中声明我只想迭代Apple对象,它应该工作.
有没有简单的方法来解决这个问题?最好不要使用var或者typeof,因为我还不允许使用这些.
你真正想要的只是那些"可浇铸"到那种类型的物品Apple.为此用途OfType<Apple>(使用linq):
foreach (Apple apple in consumables.OfType<Apple>())
{
renderer.DrawApple(apple);
}
Run Code Online (Sandbox Code Playgroud)
一个非linq解决方案将使用as运算符:
foreach(var item in consumbles)
{
var apple = item as Apple;
if(apple != null)
{
renderer.DrawApple(apple);
}
}
Run Code Online (Sandbox Code Playgroud)
然而IMO如果所有这些项目都放在同一个列表,因为它们都继承Consumble已,更好的设计都在一起,使用polymorphisem,是定义为每种类型的Consumable一个draw作为@dasblinkenlight建议的方法.并针对每种类型进行特定实施.在SegmentRemover它可能是一个空的实现的情况下,它可能Apple会调用renderer.