加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 18:01:56 所属栏目:百科 来源:网络整理
导读:我有一个名为CollidableObject的基类和一些名为Player,Enemy,InertObject等的继承类. 我试图找到一种简单的方法来遍历它们的所有实例,所以我最初创建了一个CollidableObject类型的列表,并将所有继承类的实例放在那里. 问题在于,由于多态性的性质,当我做以下
我有一个名为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()在循环中拉出右边的一个.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读