【发布时间】:2012-06-23 12:33:57
【问题描述】:
我希望我能正确解释这个问题,这对我来说有点混乱。
我一直在开发类似于 flixel 的游戏库,但使用的是 C# 的 XNA 框架而不是 Flash。现在的班级布局是这样的。
ClxBasic -> ClxObject -> ClxSprite
每个类都有一个构造函数,并调用它下面的类的构造函数。我使用此代码来执行此操作。
namespace Test
{
public class ClxBasic
{
public ClxBasic()
{
Constructor();
}
public void Constructor()
{
DoSomething();
}
}
public class ClxObject : ClxBasic
{
public ClxObject() : base()
{
Constructor();
}
public void Constructor()
{
DoSomething();
}
}
public class ClxSprite : ClxObject
{
public ClxSprite() : base()
{
Constructor();
}
public void Constructor()
{
DoSomething();
}
}
}
所以基本上当我创建一个新的 ClxSprite 时,它会调用 ClxSprite 构造函数,然后是它下面的所有构造函数(ClxObject 和 ClxBasic)。
我确信有一种更简单的方法可以做到这一点,而且我全神贯注。
然而,我更大的问题实际上是如何正确地派生和覆盖其他类的方法。
问题在于,当创建一个从 ClxSprite 扩展的类时,例如,当调用从最基本的类 (ClxBasic) 覆盖的方法时,它只会调用底部的方法,而不是顶部的方法。
我需要这样做的原因是因为我有一个全局类,它通过将自己添加到 ClxBasic 构造函数中的列表来控制从 ClxBasic 派生的所有对象。
这是一些示例代码。
namespace Test
{
public static class ClxG()
{
public static List<ClxBasic> GlobalObjects; //All objects will be added here by the ClxBasic constructor
ClxSprite test = new ClxSprite();
GlobalObjects.Add(test);
public static Update()
{
foreach(ClxBasic basic in GlobalObjects)
basic.Update(); //Calling this calls ClxBasic.Update() when it should call ClxSprite.Update()
}
}
}
当调用 basic.Update() 时,它会转到底部更新,即位于 ClxBasic 中的更新,尽管对象是 ClxObject 或 ClxSprite 或其他派生类。
我也有一个有限的修复,通过在 foreach 循环中将 ClxBasic 更改为 ClxSprite,您可以正确调用该类的构造函数方法。但是,当基于重写方法的库创建自定义类时,会调用较低的 Update。
但是,限制是您不能添加我没有专门计划的课程。例如,如果我要从 ClxSprite 派生一个 Player 类,并重写 Update() 方法,它将被添加到 GlobalObjects 列表中,但是,永远不会调用它的更新,它将去的最高的是 ClxSprite 的。
我想要它的工作方式是,在 Game1.cs 中,我希望能够将 FlxG.Update() 放入 Game.Update() 循环中并能够创建对象并让我的框架处理其余部分。
我希望我有点意思,整个事情感觉就像某种继承的开始,有点让我的大脑受伤。
【问题讨论】:
标签: c# class inheritance xna