Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为方法调用强制转换对象?_C#_Methods_Casting - Fatal编程技术网

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();

它是cast
ai
来键入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。是时候对我自己的答案大发雷霆了(这是你的一个不恰当的版本!)。