如何为方法调用转换对象?

Sha*_*awn 4 c# methods casting

我有以下类层次结构:

public class AI {
    public AI() { }
    public virtual void Update(float frameTime) { }
}

public class Boss : AI {
    public Boss() : base() { }
    public override void Update(float frameTime) { 
        Console.WriteLine("Boss Update"); 
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个包含AI变量的Character,然后我将Boss实例存储在其中并尝试将其转换为Boss的Update函数而不是基类.

AI ai = new Boss();
(Boss)ai.Update(0f);
Run Code Online (Sandbox Code Playgroud)

这不起作用,在C#中执行此操作的正确方法是什么?它是正确的另一个AI类,我甚至没有工作必须投它在所有,它只是跑更新的正确版本,所以我一定是无意中改变了一些东西.

Mar*_*ers 18

点运算符具有更高的优先级比铸造,因此您的代码被解释为:

(Boss)(ai.Update(frameTime));
Run Code Online (Sandbox Code Playgroud)

你需要添加一对额外的括号来获得你想要的东西:

((Boss)ai).Update(frameTime);
Run Code Online (Sandbox Code Playgroud)

但是,由于您的方法是虚拟的,因此不必执行此转换.

您可能还需要考虑将AI类型更改为abstract class或(如果可能)接口.

  • 当然,完全不需要强制转换,因为`Update`是虚拟的并且在`Boss`类中被覆盖. (2认同)
  • @Ed S:谢谢.添加了这个. (2认同)