注意我是初学者。
我读完了这个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);
}
答案 0 :(得分:1)
只要您的PhysicsObject没有实现TakeDamage方法(并且从不读它的类名),您可以执行以下操作:
void ProjectileHit(PhysicsObject p, PhysicsObject hit)
{
(hit as Enemy)?.TakeDamage(CurrentPlayer.EquippedTool.Damage);
}
'如'尝试将命中强制转换为Enemy,如果命中为null或转换失败,则返回null。
''仅当左侧不为空时才执行其右侧的代码。