我有一个名为'Sprite'的基类,并且还有一堆继承自它的类。为了更新和绘制所有继承的类(因为我正在使用XNA),我将在Sprite构造函数中创建的对象添加到我拥有的Sprite列表中。
//Sprite constructor excerpt
public Sprite()
{
//After all the setup code
gameSprites.Add(this);
}
//From another class
for (int i = 0; i < gameSprites.Count; i++)
{
gameSprites[i].Update(gameTime);
}
问题在于,从那个循环开始,我想要有特殊的条件,如果精灵是一个弹丸并且它与一个NPC相撞,它应该从列表中移除它自己。我知道如何检查该物体是弹丸还是NPC -
if (gameSprites[i] is Projectile)
if (gameSprites[i] is NPC)
问题是我不能使用从Sprites继承的各个类的所有属性。我该怎么做呢?我是多态性的新手,感谢帮助。
还有一件事,使用此代码 -
if (gameSprites[i] is Projectile)
我如何检查该物体是否不是弹丸?我似乎无法使用not equals运算符。感谢。
答案 0 :(得分:3)
我如何检查该物体是否不是弹丸?
像这样:
if( !(gameSprites[i] is Projectile))
如果您知道游戏精灵是射弹,您可以投射它,您将可以访问专门为射弹建造的属性:
var projectile = gameSprites[i] as Projectile;
如果gameSprites[i]
是Projectile
,则返回一个值,否则返回空值。
答案 1 :(得分:0)
而不是使用
if( variable is type )
你可以使用
var instance = variable as type;
if( instance != null ){
//instance is of Type type
}
你可以在测试后使用该对象为null,因为实例是一个正确类型的对象,可以保存一个强制转换
if( variable is type ){
var instance = (type) variable;
}|
检查变量是否属于类型现在变得微不足道了:
var instance = variable as type;
if( instance == null ){
// instance is not object of type
}
Eric Lippert对差异和使用案例有excellent article。
关于程序的其他部分;
我不会选择让精灵添加并将其自身移除到&amp;从列表中。
将其留给精灵的'用户'。它将为您提供更大的灵活性(例如,根据类型将精灵添加到不同的列表中),如果您希望通过多线程加速(几乎任何游戏都会发生这种情况),将会让您头疼。
答案 2 :(得分:0)
如果必须检查对象的类型和/或对其执行强制转换,这可能暗示了多态性。
例如,要在您的情况下执行碰撞,如果您将“Sprite”作为基类,并将“Projectile”和“NPC”作为派生类,则可以在您的实现中实现抽象或可覆盖的方法“ApplyCollision” '精灵'课程。
您的派生类会根据需要实现此方法,并且在您通常执行类型检查的代码中,您只需调用'gameSprites [i] .ApplyCollision()'。