2011-10-10 77 views
1

當我希望類層次結構的某些成員具有特殊構造代碼和任何其他成員具有泛型構造函數時,我有以下基本對象工廠。對於通用抽象對象工廠,繼承無法正常工作

我的問題在於,TileFactory沒有方法GetInstance - 如果我嘗試調用TileFactory.GetInstance(),我的程序將不會編譯。有什麼建議?

public static class ObjectFactory<K> 
     { 
      public static T GetInstance<T>() where T : K 
      { 
       T obj = (T)Activator.CreateInstance(typeof(T)); 
       return obj; 
      } 
//snip 
      } 

     } 
//snip 
     public static class TileFactory : ObjectFactory<Tile> 
     { 
     } 

回答

4

Why can't I inherit static classes?

引文從這裏:

這實際上是由設計。似乎沒有理由繼承靜態類。它具有公共靜態成員,您可以隨時通過類名稱本身進行訪問。我見過的繼承靜態東西的唯一原因是壞的,比如保存了幾個鍵入的字符。

可能有理由考慮將靜態成員直接帶入範圍的機制(我們實際上會在Orcas產品週期後考慮這一點),但靜態類繼承並不是可行的方法:使用,並且僅適用於發生在靜態類中的靜態成員。

(的Mads託格森,C#語言PM)

從Channel9的其他意見在.NET

繼承只適用於實例的基礎。靜態方法在類型級別上定義,而不是在實例級別上定義。這就是爲什麼覆蓋不適用於靜態方法/屬性/事件...

靜態方法只在內存中保留一次。沒有爲他們創建的虛擬表等。

如果您在.NET中調用實例方法,則始終將其指定爲當前實例。這是由.NET運行時隱藏的,但它發生了。每個實例方法都有一個指向運行該方法的對象的指針(引用)作爲第一個參數。這不會發生在靜態方法上(因爲它們是在類型層次上定義的)。編譯器應該如何決定選擇要調用的方法?

(littleguru)

而作爲一個有價值的想法,littleguru有針對此問題的部分 「解決辦法」:Singleton模式。

http://www.dofactory.com/Patterns/PatternSingleton.aspx

2

靜態事物沒有繼承。解決方法是使用單身人士。