我有一个名为CollidableObject
的基类和一些名为Player
,Enemy
,InertObject
等的继承类。
我试图找到一种简单的方法来遍历它们的所有实例,所以我最初创建了一个类型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类的重写/新方法。
我如何解决这个问题。有没有办法迭代同一个树中的对象集合,但保持它们的继承类型?
答案 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(....);
}
这将是“面向对象”的方式。