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

前端之家收集整理的这篇文章主要介绍了c# – 遍历基类和继承类的所有实例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个名为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类的重写/新方法.

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

解决方法

Is there no way to iterate through a collection of objects from the same tree but maintaining their inherited type?

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

> CollidableObject中的Draw方法需要标记为虚拟
>播放器中的Draw方法需要标记为覆盖.

这将确保来自您的帖子的调用将被路由到Player的方法覆盖,而不是路由到基础的方法.

在相关的说明中,当您看到使用is运算符检查对象的动态类型的代码时,如if(CollidableObject是Player),您应该强烈怀疑您正在做错误的操作.例如,您可能错过了double dispatch.

如果您需要知道的是该类型的正确纹理,您可以将纹理放在Dictionary< Type,Texture>中. textureForType,并使用可碰撞对象的GetType()在循环中拉出右边的一个.

原文链接:https://www.f2er.com/csharp/97310.html

猜你在找的C#相关文章