遍历基类和继承类的所有实例

时间:2013-12-19 17:13:59

标签: c# inheritance polymorphism draw

我有一个名为CollidableObject的基类和一些名为PlayerEnemyInertObject等的继承类。

我试图找到一种简单的方法来遍历它们的所有实例,所以我最初创建了一个类型CollidableObject的列表,并将所有继承类的实例放在那里。

事情是,由于多态性的性质,当我做以下

foreach (CollidableObject CollidableObject in collidableObjects)
{
  if (CollidableObject is Player)
  {
    CollidableObject.Draw(spriteBatch, testPlayerTexture); 
  }
  // Then the same prodedure for each type of CollidableObject. 
  // Might change to switch or something.                              
}

它调用的draw方法是来自CollidbaleObject库的通用Draw方法,而不是来自Player / Enemy / inertObject类的重写/新方法。

我如何解决这个问题。有没有办法迭代同一个树中的对象集合,但保持它们的继承类型?

3 个答案:

答案 0 :(得分:9)

  

是否无法迭代同一树中的对象集合,但维护其继承类型?

当然,有一种方法可以做到这一点。但是,您需要以适当的方式设置层次结构:

  • Draw中的CollidableObject方法需要标记为virtual
  • Draw中的Player方法需要标记为override

这将确保来自您帖子的电话会被路由到Player的方法覆盖,而不是基础方法。

在相关的说明中,当您看到使用is运算符检查对象的动态类型的代码时,如if (CollidableObject is Player)中所示,您应该强烈怀疑您做错了什么。例如,您可能遗漏了double dispatch

如果你需要知道的是该类型的正确纹理,你可以将纹理放在Dictionary<Type,Texture> textureForType中,然后使用可碰撞对象的GetType()在循环中拉出正确的纹理。 / p>

答案 1 :(得分:4)

你试过了吗?

foreach (CollidableObject CollidableObject in collidableObjects)
{
    if (CollidableObject is Player)
    {
        ((Player) CollidableObject).Draw(spriteBatch, testPlayerTexture); 
    }    
    //Then the same prodedure for each type of CollidableObject. Might change to switch or something.                              
}

答案 2 :(得分:-1)

我希望每个类都实现一个特定于该类的Draw方法。他们都需要相同的签名。

那么你的foreach并不关心它实际上是哪一类,看起来像这样

foreach (CollidableObject CollidableObject in collidableObjects)
{
      CollidableObject.Draw(....);                                        
}

这将是“面向对象”的方式。