c# - 覆盖静态字段

标签 c# windows static polymorphism

我正在为我的游戏编写一个 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/

相关文章:

PHP - 是否有机会通过 exec() 运行 GUI 程序?

c++ - Visual Studio 2012 应用程序窗口创建/调整大小不同于 VS2008 窗口创建?为什么?

go - 这段代码中/static/是什么意思?

c# - Wpf 自定义窗口,Windows 边缘调整大小功能

c# - 在 .Net core 2.0 中使用 AES 和 PKCS#7 填充时,指定的填充模式对此算法无效

c# - 注入(inject)不同的项目/程序集

c# - 绑定(bind)到当前项目中未声明的属性

c++ - 套接字心跳与保活

c# - C# 静态类私有(private)字段线程安全吗?

django - Nginx不提供静态服务