重写静态字段

我正在为我的游戏编写一个C#游戏引擎,并且遇到了一个问题。

我需要为每个不同types的块创build一个XNA.Rectangle drawRectangle。

块被存储在一个块列表中,所以这个属性可以通过draw来访问,而不需要投射很多东西,所以必须重写。

我已经尝试了很多方法,但都没有成功。

这是我正在做的最新的一个:

Block.cs

protected static Rectangle m_drawRectangle = new Rectangle(0, 0, 32, 32); public Rectangle drawRectangle { get { return m_drawRectangle; } } 

BlockX.cs

 protected static Rectangle m_drawRectangle = new Rectangle(32, 0, 32, 32); 

但是,当创buildBlockX并访问drawRectangle ,它仍然返回0,0,32,32。

理想情况下,我可以重写drawRectangle成员,但是这样做意味着要在每个块类中创build一个成员。 我只想调整m_drawRectangle。

每个块将被创build几百次,所以我不希望它是非静态的,在构造函数中执行它会很愚蠢。

有没有更好的方法,而不是只是把一个静态函数初始化每个块的静态事物?

编辑:

所以总结起来,我的要求是:

  • BlockX.cs中的最小额外代码可以覆盖
  • 字段必须保持静态
  • 最好不要重写drawRectangle ,只有m_drawRectangle
  • 每次访问属性时不必创build一个新的矩形

Solutions Collecting From Web of "重写静态字段"

静态成员不是多态的调用 – 就这么简单。 请注意,你谈论的财产保持静态 – 你目前没有一个静态属性。 你有一个实例属性和两个静态字段

几个选项:

  • 在每个类中被覆盖的虚拟成员,即使它不需要除了类型之外的对象的任何状态
  • 通过矩形绘制块的构造函数,并将其存储在一个字段中

如果使用virtual关键字,则不必在每个类中重写drawRectangle。

Block.cs

 protected static Rectangle m_drawRectangle = new Rectangle(0, 0, 32, 32); public virtual Rectangle drawRectangle { get { return m_drawRectangle; } } 

BlockX.cs

 private static Rectangle m_drawRectangleX = new Rectangle(32, 0, 32, 32); public override Rectangle drawRectangle { get { return m_drawRectangleX; } } 

您不能覆盖静态成员。

我意识到你不想重写drawRectangle,但这似乎是最简单的解决方案来实现给你什么你的问题。 最好的解决方案是在每个派生类中声明一个新的静态字段,并覆盖实例属性以获得所需的结果:

 public class Block { private static Rectangle m_drawRectangle = new Rectangle(0, 0, 32, 32); public virtual Rectangle drawRectangle { get { return m_drawRectangle; } } } public class BlockX : Block { private static Rectangle m_drawRectangle = new Rectangle(0, 0, 32, 32); public override Rectangle drawRectangle { get { return m_drawRectangle; } } } 

正如其他人所提到的,你不能重写一个静态成员,但是我想在回答时即时考虑在静态成员创建期间或由于应用程序池回收或类似事件而可能出现的任何问题。

 public class Block { private static Rectangle m_drawRectangle; public virtual Rectangle drawRectangle { get { if(m_drawRectangle == null) m_drawRectangle = new Rectangle(0, 0, 32, 32); return m_drawRectangle; } } } public class BlockX : Block { private static Rectangle m_drawRectangle = new Rectangle(0, 0, 32, 32); public override Rectangle drawRectangle { get { if(m_drawRectangle == null) m_drawRectangle = new Rectangle(0, 0, 32, 32); return m_drawRectangle; } } }