我正在写一个C#游戏引擎为我的比赛,我已经打了一个问题。
我需要为每个不同类型的块做XNA.Rectangle DrawRectangle的。
块存储在块的列表,这样的财产,是由抽签访问,无需铸造了很多,必须重写。
我试过很多的做这件事的方式,但没有工作。
下面是当前我做:
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);
然而布洛克斯创建和访问时drawRectangle
,它仍返回0,0,32,32。
理想情况下我可以只覆盖drawRectangle
成员,但这样做将意味着建立在每一个块类中的成员。 我只是想调整m_drawRectangle。
每块将被创建数百次,所以我不希望它成为非静态的,这将是愚蠢的,做它在构造函数中。
有没有更好的办法比只是把一个静态函数初始化每块一成不变的东西其他?
编辑:
所以总结起来,我的要求是:
- 在BlockX.cs覆盖很少的额外代码
- 现场必须保持静态
- 最好不要有覆盖
drawRectangle
,只有m_drawRectangle
。 - 不必创建一个新的矩形每次访问该属性时
静态成员不是多态称为 - 就这么简单。 请注意,请您谈谈财产留静态-你不必在目前的静态属性。 你有一个实例属性和两个静态字段 。
一对夫妇的选择:
- 这是在每个类别中重写时,即使它不从比其其它类型的对象需要的任何状态的虚拟构件
- 通过矩形绘制成块的构造函数,并将其存储在一个字段
你不必重写的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;
}
}
}