我希望我能解释这个问题,对我来说有点令人困惑。如何调用顶级构造函数?
我一直在研究类似于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,您可以正确调用该类的构造方法。但是,当根据重写方法的库创建自定义类时,将调用较低的更新。
但是,限制是你不能添加我没有明确规划的类。例如,如果我要从ClxSprite派生一个类Player并覆盖Update()方法,它将被添加到GlobalObjects列表中,但从来没有调用过它的更新,它将会是ClxSprite的最高版本。
我想它的工作方式是,在Game1.cs我想就能够把FlxG.Update()在Game.Update()循环,只是能够创建对象,并有我的框架处理其余的。
我希望我已经有了一些感觉,整个事情感觉像某种形式的遗传开始,有点让我的大脑受伤。
这是否也调用它下面的所有方法呢?你能告诉我如何用三个班而不是两个班来完成吗?所有类都应该调用它下面的构造函数,以使Update循环正常工作。 – redcodefinal
@ user406470:我添加了第三类;它的工作原理与第二个一样... –
这很完美。谢谢,一切都如此。我真的很感激这个帮助,这让我疯狂。 – redcodefinal