2012-06-24 190 views
1

我正在爲我的遊戲編寫C#遊戲引擎,並且遇到了問題。覆蓋靜態字段

我需要爲每個不同類型的塊做一個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); 

然而布洛克斯創建和訪問drawRectangle時,它仍然會返回0, 0,32,32.

理想情況下,我可以覆蓋drawRectangle成員,但是這樣做意味着要在每個塊類中創建一個成員。我只想調整m_drawRectangle。

每個塊將被創建數百次,所以我不希望它是非靜態的,並且在構造函數中執行它會很愚蠢。

除了只是將靜態函數初始化爲每個塊中的靜態事物之外,還有其他更好的方法嗎?

編輯:

所以總結起來,我的要求是:在BlockX.cs

  • 最少的額外代碼重寫
  • 現場必須保持靜態
  • 最好不用重寫drawRectangle ,只有m_drawRectangle
  • 不必創建一個新的矩形每次訪問該屬性

回答

6

靜成員並不多態調用的時候 - 就這麼簡單。請注意,你談論屬性靜態 - 你不一個靜態屬性此刻。你有一個實例屬性,和兩個靜態的字段

幾個選項:

  • 其在每個類別中重寫時,即使它並不需要從比其類型
  • 其他對象的任何狀態傳遞矩形繪製到虛擬構件塊的構造函數,並將其存儲在一個字段中
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; } 
    } 
} 
2

你不必重寫的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; } 
} 
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; 
      } 

    } 
}