C# 如何为方法调用强制转换对象?
我有以下类层次结构:C# 如何为方法调用强制转换对象?,c#,methods,casting,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
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的更新函数,而不是基类的更新函数
AI ai = new Boss();
(Boss)ai.Update(0f);
但这不起作用,在C#中,什么是正确的方法?它与另一个AI类正常工作,我甚至不必强制转换它,它只运行了正确版本的更新,因此我一定是无意中更改了某些内容。该类的转换比强制转换更为有效,因此您的代码被解释为:
(Boss)(ai.Update(frameTime));
您需要添加一对额外的括号以获得所需内容:
((Boss)ai).Update(frameTime);
但是,由于您的方法是虚拟的,所以不必执行此强制转换
您还可以考虑将<代码> Ai/Cuff>类型更改为<代码>抽象类< /代码>或(如果可能的话)一个接口。
< P>您需要在CAST和CAST对象周围添加PARNS,以调用CAST值上的方法(即,<代码>((Sytype)某个Objo))。但这不是重点,因为演员阵容完全没有必要Update
是虚拟的,调用是多态的,因此即使ai
变量被声明为ai
的一个实例,它实际上也会调用Boss.Update()
,因为这才是真正的幕后类型
这正是多态性强大的原因。您不必知道底层类型是什么,就可以获得正确的、特定于实现的行为。您的代码行是什么意思:
AI ai = new Boss();
(Boss)ai.Update();
是获取从Update()返回的内容代码>并将其强制转换为类型Boss
你需要做的是
AI ai = new Boss();
((Boss)ai).Update();
它是castai
来键入Boss并调用Update()
方法。在Boss类上调用Update方法不需要cast,因为您在ai类中将该方法标记为virtual
,并且在Boss类中指定了override
。顺便说一句,我注意到您发布的代码无法编译。@Ed S:代码示例应该是这些难题之一找出这张图片中所有的错误。
@JasonDown:是的,我们都从某个地方开始。直到我有了一个关于多态性的真实用例和随后的“啊哈!”时刻,我才“理解”多态性。当简单地告诉你它是什么的时候,它是非常抽象和难以理解的。有点像向盲人解释一幅壮丽的景色。这只是代码的一个简化版本,因此询问起来更简单,所以告诉我我在任意代码上打错了也没用@Wily博士的徒弟:它在实际代码中被重写,但它仍然运行AI.Update()
,而不是Boss.Update()
。它给我的问题是它运行的是基本的Update
版本,而不是Boss
版本。@Shawn:嗯,你作为示例发布的代码实际上是非常相关的,如果你的示例代码在语义上与真实代码相同,那么肯定会调用Boss.Update
,显然这个例子是不够的。除了使用您自己的示例之外,我们如何假设知道什么是相关的,什么是不相关的?当然,演员阵容根本不需要,因为Update
是虚拟的,并且在Boss
类中被重写。+1用于更详细地说明为什么演员阵容是不必要的。Ya+1。是时候对我自己的答案大发雷霆了(这是你的一个不恰当的版本!)。