【发布时间】:2016-10-31 14:20:37
【问题描述】:
注意我是初学者。
我通读了这个this question,我明白将派生类传递给请求基类的方法是完全可以的,应该可以工作。
好吧,我有一个继承“PhysicsObject”的类“Enemy”。 但是,当我编写以下碰撞处理程序并使用 PhysicsObject 和 Enemy 调用它时:
void ProjectileHit(PhysicsObject p, PhysicsObject hit)
{
hit.TakeDamage(CurrentPlayer.EquippedTool.Damage);
}
我在视觉工作室得到一条红线说 PhysicsObject 不包含“TakeDamage”的定义。 碰撞处理程序是我使用的框架的一部分,它只接受它看起来的基类实例。有什么方法可以将实例传递给“Enemy”到该处理程序并在其中调用“TakeDamage”?
编辑: 这行得通吗?
void ProjectileHit(PhysicsObject p, PhysicsObject hit)
{
Enemy e = hit as Enemy;
e.TakeDamage(CurrentPlayer.EquippedTool.Damage);
}
【问题讨论】:
-
要么将
TakeDamage设为PhysicsObject的虚拟方法,要么将方法更改为采用确实具有该方法的某种类型。 -
嗯,错误很明显,如果
PhysicsObject没有实现,那么它将无法工作。你可以重新工作TakeDamage吗? -
我无法更改碰撞处理程序的工作方式或 PhysicsObject 的代码,但我可以更改 Enemy 和 TakeDamage,是的。
-
您想检查 e 是否为 null,因为 as-Keyword 会强制转换或返回 null。
标签: c# inheritance polymorphism