2010-09-14 82 views
1

像很多C#程序員一樣,我最終發現自己需要基本上是靜態抽象方法的功能。我完全意識到爲什麼它不能完成,這是有道理的,但我需要一個解決方法。C#中的靜態抽象方法(特定用例的替代方法)

我正在開發XNA遊戲,但問題並沒有涉及太多的XNA代碼,幸運的是。我有一個抽象基類Note,以及從它派生的各種子類。在某個時候,我會將它們繪製到屏幕上,因此我將不得不加載紋理(每個子類都會具有不同的紋理和不同的紋理數量),讓用戶輸入尺寸參數,將紋理縮放到尺寸,然後迭代我的List和Draw()中的每一個。這些紋理非常大,每個給定子類的每個實例都將使用相同尺寸的相同紋理,直到用戶指定不同的尺寸,因此我採取靜態方法的動機。

正如我所發現的,抽象靜態方法不可用。我希望能夠爲每個子類一次完成一次紋理大小調整(每當用戶更改大小參數時),將縮放紋理保存爲靜態Texture2D對象,並且每次繪製一個實例Note子類型。這樣,我可以避免在給定的Note派生類的每個實例中都有一個Texture2D對象,並且也必須在每個實例中縮放Texture2D。另外,我希望能夠有效地執行「Note的所有具體子類必須實現此靜態方法」。

我不完全確定什麼是最好的方法。我寧願一個辦法做到這一點並沒有涉及到需要在每個子類的靜態方法,例如:

NoteA.LoadScaledTex(scale); 
NoteB.LoadScaledTex(scale); 
NoteC.LoadScaledTex(scale); 
... 
foreach(Note n in notes) {..} 

,但我不知道任何其他優雅的解決方案。

回答

3

靜態實際上並不是真的恰當,因爲一個給定的數據應該在特定類型的所有實例中共享。相反(在這種情況下尤其如此),您應該使用單例,其中所有實例都內部引用相同的單個實例來存儲共享數據。通過這種方式,您可以輕鬆地覆蓋各種繼承級別的實現,甚至可以靈活地讓某些派生類型不使用單例。

public abstract class Note 
{ 
    public abstract void LoadScaledTex(scale); 
} 

public class NoteA : Note 
{ 
    private static ScaledTexData instance; 

    public override void LoadScaledTex(scale) 
    { 
     lock(this.GetType()) 
     { 
      if(instance == null) 
      { 
       instance = new ScaledTexData(scale); 
      } 
     } 
    } 
} 
+0

我仍然認爲我必須爲Note的每個子類聲明其中的一個(因爲每個子類型都有不同數量的紋理)。 – 2010-09-15 01:18:15

+1

@Mark爲什麼這是一個問題? – 2010-09-15 01:45:44