我正在为我的游戏编写一个 C# 游戏引擎,但我遇到了一个问题。
我需要为每个不同类型的 block 做一个 XNA.Rectangle drawRectangle。
block 存储在 block 列表中,因此必须覆盖可以通过绘制访问而无需大量转换的属性。
我尝试了很多方法,但没有一个奏效。
这是我目前正在做的:
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);
但是当创建 BlockX 并访问 drawRectangle
时,它仍然返回 0, 0, 32, 32。
理想情况下,我可以覆盖 drawRectangle
成员,但是这样做意味着在每个单独的 block 类中创建一个成员。我只想调整 m_drawRectangle。
每个 block 都会被创建数百次,所以我不希望它是非静态的,在构造函数中这样做会很愚蠢。
除了在每个 block 中放置一个静态函数来初始化静态事物之外,还有什么更好的方法吗?
编辑:
综上所述,我的要求是:
- BlockX.cs 中要覆盖的最少额外代码
- 字段必须保持静态
- 最好不必覆盖
drawRectangle
,只需覆盖m_drawRectangle
。 - 不必在每次访问属性时都创建一个新的矩形
最佳答案
静态成员不会被多态地调用——就这么简单。请注意,您谈论的属性保持是静态的——您目前拥有静态属性。您有一个实例属性和两个静态字段。
几个选项:
- 在每个类中被重写的虚拟成员,即使它不需要对象的任何状态而不是其类型
- 将要绘制的矩形传入 block 的构造函数中,并存储在一个字段中
关于c# - 覆盖静态字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11179318/