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

时间:2011-12-14 22:18:54

标签: 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"); 
    }
}

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

AI ai = new Boss();
(Boss)ai.Update(0f);

这不起作用,在C#中执行此操作的正确方法是什么?它正在与另一个AI类正常工作,我根本没有 来构建它,它只是运行了正确的Update版本,所以我必须无意中改变了一些东西。

3 个答案:

答案 0 :(得分:18)

dot operatorhigher 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()方法。