我有一个名为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()在循环中拉出右边的一个.