多态继承类属性

时间:2013-11-20 14:47:12

标签: c# xna polymorphism

我有一个名为'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运算符。感谢。

3 个答案:

答案 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()'。