2011-06-23 21 views
0

我有一個基類和從該基類派生的幾個子類。我也有基類中的靜態函數,它需要一些參數,並基於輸入參數(我的工廠方法)實例化並返回一個適當的子類。c#工廠方法和保護級別問題

現在,我的問題是:我只想允許實例化子類從工廠方法。但是,如果我設置要保護的子類的構造函數,基類將無法看到它們。是否有我缺少的訪問修飾符允許基類調用子類的構造函數,但不允許任何其他類調用它們?

內部看起來不會有效......我想限制只有基類的子類構造函數的訪問權限,在同一個程序集中還有其他類應該能夠訪問基本工廠方法但不能直接實例化任何子類。

希望有很簡單的東西,我失蹤...

例子:

public class Base 
{ 
    public Base CreateChild(string childType) 
    { 
     if(childType == "A") 
      return new ChildA(); 
     if(childType == "B") 
      return new ChildB(); 

     return null; 
    } 
} 

public class ChildA 
{ 
    protected ChildA() // This doesn't work, since now base class can't call this! 
    { 
    } 
} 

public class ChildB 
{ 
    protected ChildB() 
    { 
    } 
} 

回答

1

可以聲明子類的私有嵌套類裏面基地

+0

此外,您可以使Base和ChildA/B部分化,並且只需在Base中聲明Child,然後讓另一個Partial Base和Child聲明所有代碼,以使它們保持獨立。 – max

+0

謝謝,這對我很好。希望我可以給你和zsalzbank信貸,因爲你們都給出了同樣的答案,並沒有告訴我只是做一些完全不同的事情,比如大多數時候我會去一個論壇尋求幫助。;) – SomeGuy

1

您是否嘗試過的基類中聲明的子類?

public class Base { 
    protected class ChildA {} 
    protected class ChildB {} 
} 
0

如果通過基地式訪問任何衍生對象是一個有效的方案(假設派生類型僅覆蓋基於的實現並且不添加新的功能),那麼建議的使得派生的類型嵌套private類的解決方案(如先前的答案所建議的)是最佳方案。

如果不是這樣的話,我認爲你陷入了不合理的案件的複雜性。爲什麼您的同一程序集的代碼無法訪問ChildAChildB構造函數?畢竟你可以控制的代碼,所以你總是可以選擇通過代碼審查來制定/執行他的初始化是通過工廠方法。

據我所知,有理由不讓外部程序集自由實例化對象,除非通過嚴格控制的機制。在這種情況下,只需將構造函數標記爲internal即可。

否則,我不知道你能實現你不只是爲這個基地類和它的派生創建特定組件假裝什麼。肯定沒有訪問修飾符,它會使派生的類中的靜態方法只能從其基類類中看到。

+0

其他答案實際上給了這個很好的解決方案......我認爲這不是不必要的複雜性。 我正在使用sublcasses進行比較。如果他們是從工廠方法創建的,我知道CORRECT子類是實例化的,而不是可能是手動構建的不同子類。我不想複製一堆代碼來找到最佳匹配,所以使用工廠方法真的可以簡化我的工作。 – SomeGuy

+0

@SomeGuy:就像我的回答狀態(我在編輯時,我猜你讀到它時)。如果派生類型只覆蓋基本實現,那麼是的,它是一個有效的解決方案。但是如果他們添加了功能,那麼你只能通過基類型調用(特定的派生類型無法訪問)。你沒有真正在你的問題中指定。 'ChildA a =(ChildA)Base.CreateChild(「A」);'本來是一個有效的場景。 – InBetween

+0

是的,我試圖保持這個例子簡單...而我在你編輯時實際上是評論。 我的實際程序是一個撲克程序,其中我使用了一個基本的PokerHand類和一組衍生的特定手(FullHouse,Striaght等)。在派生類中沒有真正的功能,我只想要一組手正確排序和工廠方法來找出它是什麼類型的手......但顯然我不能錯誤地輸入錯誤的手,否則事情會變得非常困難。 – SomeGuy