覆盖静态字段

时间:2012-06-24 16:50:06

标签: c# windows static polymorphism

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

但是,在创建BlockX并访问drawRectangle时,它仍会返回0,0,32,32。

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

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

除了仅使用静态函数初始化每个块中的静态内容之外,还有更好的方法吗?

编辑:

总而言之,我的要求是:

  • BlockX.cs中的最小额外代码,以覆盖
  • 字段必须保持静止
  • 最好不要覆盖drawRectangle,只需覆盖m_drawRectangle
  • 每次访问媒体资源时都不必创建新的矩形

4 个答案:

答案 0 :(得分:6)

静态成员不是多态的 - 它就是那么简单。请注意,您谈论属性保持静态 - 此时 没有静态属性。您有一个实例属性和两个静态字段

有两种选择:

  • 在每个类中重写的虚拟成员,即使它不需要来自对象以外的任何状态
  • 传递矩形以绘制到块的构造函数中,并将其存储在字段

答案 1 :(得分:2)

如果使用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; }
}

答案 2 :(得分:1)

您无法覆盖静态成员。

我意识到你不想覆盖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; }
    }
}

答案 3 :(得分:0)

正如其他提到的那样,你不能覆盖静态成员,但我想在答案上即兴发挥,考虑到静态成员创建过程中或应用程序池回收或类似事件时可能出现的任何问题。

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; 
            }

    }
}