【发布时间】:2011-12-14 22:18:53
【问题描述】:
我有以下类层次结构:
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 类上的 Update 方法不需要强制转换,因为您已在 AI 类中将该方法标记为
virtual,并且您已在老板班。顺便说一句,我注意到您发布的代码无法编译。 -
@Ed S.:代码示例应该是这些难题之一。
Find all of the things that are wrong with this picture. -
@JasonDown:是的,我们都从某个地方开始。我根本没有“得到”多态性,直到我有一个真实世界的用例和随后的“啊哈!”片刻。当简单地告诉它是什么时,它非常抽象且难以理解。有点像向盲人解释壮丽的景色。只是不一样。
-
这只是代码的简化版本,因此询问起来更简单,因此告诉我我在任意代码上打错了也无济于事。 @博士。 Wily 的学徒:它在实际代码中被覆盖,但它仍然运行
AI.Update()而不是Boss.Update()。它给我的问题是它运行的是基本的Update而不是Boss版本。 -
@Shawn:嗯,您作为示例发布的代码实际上非常相关,如果您的示例代码在语义上与您的真实代码相同,那么肯定会调用
Boss.Update,所以显然这个例子是不够的。除了使用您自己的示例之外,我们如何假定知道什么是相关的和不相关的?