【问题标题】:How to pass derived class as a parameter to a method that asks for a base class如何将派生类作为参数传递给请求基类的方法
【发布时间】: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


【解决方案1】:

只要你的 PhysicsObject 没有实现 TakeDamage 方法(并且读取你的类名它永远不应该)你可以执行以下操作:

void ProjectileHit(PhysicsObject p, PhysicsObject hit)
{
    (hit as Enemy)?.TakeDamage(CurrentPlayer.EquippedTool.Damage);
}

'as' 尝试对 Enemy 施放 hit 并在 hit 为 null 或施放失败时返回 null。

'?'仅当左侧不为空时才执行其右侧的代码。

【讨论】:

  • 是的,我自己刚刚发现了“as”,并在我原来的问题中对其进行了编辑。谢谢!
  • 我应该删除我的问题还是值得保存?
猜你喜欢
  • 2011-06-03
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 2020-02-24
  • 2013-08-02
  • 2015-08-20
  • 2013-02-02
  • 1970-01-01
相关资源
最近更新 更多