2011-05-09 122 views
4

我有一個父類,並且有一些從它繼承的子類型。父類和子類的實例數

我想確保只有一個父項的實例,也適用於所有的子類型。父類型:

private static int _instanceCount = 0; 

public ParentClass() 
{ 
    protected ParentClass() // constructor 
    { 
     _instanceCount++; 

    if (_instanceCount > 1) 
     throw new exception("Only one instance is allowed."); 
    } 
} 

樣品子類:

private static int _instanceCount = 0; 

public ChildClass() : ParentClass 
{ 
    public ChildClass() : base() // constructor 
    { 
     _instanceCount++; 

     if (_instanceCount > 1) 
      throw new exception("Only one instance is allowed."); 
    } 
} 

的解決方案適用於兒童的類型,但是當他們調用基類的構造函數我無法分辨,如果基類的構造與其他類型或沒有所謂的該解決方案失敗。

我該如何做到這一點?

+0

你可以通過單例類實現相同的功能 – anishMarokey 2011-05-09 18:05:16

+0

單例在這裏不起作用。我用'MEF'來使用這些類型,這會在需求時懶惰地實例化它們。實際上,我已經在更高級別實現了'container'作爲'Singleton',並且這是一個確保我沒有多個'container'的檢查。 – Xaqron 2011-05-09 18:07:32

回答

2

你應該能夠告訴我們,如果你是從這樣的一個子類,稱爲:

if(this.GetType().Equals(typeof(ParentClass))) 
{ 
    //we know we're not being called by a sub-class. 
} 

當然,你可以直接跳過遞增子類中的計數的步驟,並且只做它在父母以及...有線程問題。

+0

哦,我喜歡!十分優雅 – 2011-05-10 14:08:55

1

這聽起來像你想要的功能Singleton

+0

另請參閱http://msdn.microsoft.com/en-us/library/ff650316.aspx – 2011-05-09 18:06:35

0

好的......這可能是一個非常糟糕的黑客攻擊......但是您可以從Environment.StackTrace中獲取堆棧跟蹤,並在運行構造函數代碼之前查看被調用者是否是您的子類。 大聲笑...祝你好運! :)

1

可能還有其他的方法來處理你想要做的事情,比如使用Singletons,但是確保調用基本構造函數不會給你帶來誤判的一種方法是檢查它的類型,比如爲:

protected ParentClass() 
{ 
    if (!GetType().Equal(typeof(ParentClass))) 
    { 
    // The child class has taken care of the check aleady 
    return; 
    } 
}