2012-01-23 123 views
2

我有幾個是單身類,所以我試圖創建getInstance方法(PARAMS)和派生類父BaseClass的,應該實現此方法,並返回theiselfs的情況下,(所以我沒有來施放它們)...因爲它們是單例,所以該方法應該是靜態的,但不允許重寫靜態方法。編碼它的最佳方法是什麼?示例代碼我想:返回單實例

public class Base { 

    public static virtual T GetInstance<T>() where T : class; 
    } 


    public class Derived { 
    Derived instance; 

    public static override T GetInstance<T>() where T : typeOf(this){ 
     if (instance == null) { 
     instance = new Derived(); 
     } 
     return instance; 
    } 
    } 
代碼的這個之外我想打電話給

Derived.GetInstance().SomeDerivedMethod() 

(Derived.GetInstance() as Derived).SomeDerivedMethod() and not 
new Derived().getInstance().SomeDerivedMethod() 

我知道這樣不好,和我有欠缺與T型的經驗也是如此,所以任何意見都歡迎。 感謝

編輯:

或者是否有可能以某種方式定義在基地的GetInstance()方法,所以派生類不需要ovwerride它,但它會從那裏返回類的實例它被稱爲... Derived.GetInstance()將返回派生

+1

應該這個類有什麼目的? IoC容器很可能會更合適。 – Groo

+0

我將有更多的單身人士,因此我想拉起邏輯中的方式,從母公司靜態繼承方法總是可以返回從那裏它被稱爲(即使它是從後代)類型的實例創建實例 – Zavael

+0

這裏類似的討論http://www.codeguru.com/forum/showthread.php?t=376943,它看起來像有沒有辦法強迫後代是單身,看起來像我想要的東西奇怪.. :( – Zavael

回答

3

您可以使用您的singletones一個Dictionary<Type, Object>。下面的方法要求每個類型實現私有的構造函數。當然,如果在單例字典中已經有一個類的實例,你也可以在每個派生類中進行檢查。這甚至會避免有人使用Activator來創建實例。

未測試:

public class Base { 
    static Dictionary<Type, Object> _Singletones = new Dictionary<Type, Object>(); 
    public static T GetInstance<T>() where T : class { 
     Type t = typeof(T); 
     if (_Singletones.ContainsKey(t)) 
      return _Singletones[t] as T; 
     else { 
      // Create instance by calling private constructor and return it 
      T result = Activator.CreateInstance(t, true) as T; 
      _Singletones.Add(t, result); 
      return result; 
     } 
    } 
} 
+0

這是好的,儘管像這樣的靜態方法應該是線程安全的。 – Groo

+0

是的男人!它幾乎...但我怎麼能從類型不是從參數,而是從調用類,所以而不是Base.GetInstance ()= Derived.GetInstance ()我應該調用Base.GetInstance(),它返回Base和Derived.get ..返回派生 – Zavael

+0

@Groo你是對的,但是當你有性能關鍵的代碼時(例如多次訪問該方法),這可能會令人討厭。也許使用2個字典(Swapping)可以提高性能。 –

3

的情況下儘量抽象工廠設計模式。也許其他creational design patterns也可能適合。

您需要強制執行的廠級的「單性」,然後通話可能看起來像:

FooFactory.GetBarInstance().SomeDerivedMethod(); 
+0

工廠不知道,創造派生類的哪個實例... – Zavael

+0

@Zavael:這就是爲什麼它被稱爲抽象如果你需要一個Foo,您使用FooFactory它可以實現一個通用的接口,但每個工廠實例化自己的類型。 。 – Groo

0

爲什麼不能簡單地聲明方法非泛型和直接使用派生類型:

public class Derived { 
    Derived instance; 

    public static Derived GetInstance() { 
    if (instance == null) { 
     instance = new Derived(); 
    } 
    return instance; 
    } 
} 
+0

是的,這是一種方式。我想強制任何派生類通過父Base實現單例方法GetInstance()。 – Zavael

+1

你不能在C#中強制執行一個靜態方法 –

+0

是的,我知道,這就是爲什麼我要求的建議,如果它是可能的所有實現我想:) – Zavael

2

它不是一個真正的答案,但也許它很高興知道無論如何。 Lazy

+1

+1感謝lazysingleton1雙檢:)我的lambda版本無法使用,因爲我沒有一個實例,但單身字典 – Zavael