我有以下类层次结构:
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");
}
}
我有一个包含AI变量的角色,然后我将Boss实例存储在其中并尝试将其转换为Boss的Update函数而不是基类。
AI ai = new Boss();
(Boss)ai.Update(0f);
这不起作用,在C#中执行此操作的正确方法是什么?它正在与另一个AI类正常工作,我根本没有 来构建它,它只是运行了正确的Update版本,所以我必须无意中改变了一些东西。
答案 0 :(得分:18)
dot operator有higher precedence而非投射,因此您的代码被解释为:
(Boss)(ai.Update(frameTime));
您需要添加一对额外的括号才能获得所需内容:
((Boss)ai).Update(frameTime);
但是,由于您的方法是虚拟的,因此不必执行此转换。
您可能还需要考虑将AI
类型更改为abstract class
或(如果可能)接口。
答案 1 :(得分:4)
你需要在强制转换和强制转换对象周围添加一些parens来调用强制转换值的方法(即((SomeType)someObj).SomeMethod()
),但这就是要点,因为强制转换是完全没必要的。
Update
是虚拟的,并且调用是多态的,所以即使ai
变量被声明为AI
的实例,它实际上会调用Boss.Update()
,因为它是类型真的是在幕后。
这正是多态性强大的原因。您不必知道底层类型是什么来获得正确的,特定于实现的行为。
答案 2 :(得分:0)
您的代码行说了什么:
AI ai = new Boss();
(Boss)ai.Update();
取自Update();
返回的内容并将其转换为Boss
你需要做的是
AI ai = new Boss();
((Boss)ai).Update();
投射ai
以输入Boss并调用Update()
方法。