2012-07-26 69 views
6

我想知道爲什麼單身人士班應該被封閉。如果我們將構造函數設置爲私有的,那麼我們可以防止這個類被派生出來嗎?..下面我正在從MSDN上粘貼幾行代碼。請給我一些顏色吧..爲什麼單身人士班應該被封閉?

在這種策略中,該實例是在第一次引用該類的任何成員時創建的。公共語言運行庫負責變量初始化。該課程標記爲以防止派生,可能會添加實例。關於標記密封類的優缺點的討論,請參閱[Sells03]。另外,該變量被標記爲只讀,這意味着它只能在靜態初始化(這裏顯示)或類構造函數中分配。

http://msdn.microsoft.com/en-us/library/ff650316.aspx

回答

0

這是一種設計準則,很明顯,你可以按照與否。這只是標誌着你的設計意圖,例如在基類中將其標記爲abstract以避免未來可能的混亂。

2

sealed關鍵字表示該類不能被繼承。將構造函數聲明爲私有意味着無法創建該類的實例。

這些不是一回事。您可以擁有一個帶有私有構造函數的基類,但仍然繼承該基類,定義一些公共構造函數,並有效地實例化該基類。

請記住,構造函數不是繼承的(所以派生類不會因爲基類而具有所有私有構造函數),並且派生類始終首先調用基類構造函數。標記類sealed可防止某人輕鬆地繞過您精心構建的單身人士課程,因爲它會阻止某人從課程中繼承。

+0

如果派生類可以訪問私有構造函數*,則只能從基類派生*。看到我的答案是唯一可行的方法。 – 2012-07-26 11:53:35

+0

但是我不能夠建立下面的代碼類BaseClass的 { 私人的BaseClass(){ } } 類Derrived:BaseClass的 { 公共無效顯示(){ 控制檯 。WriteLine(「In Derrived class」); } }我得到的錯誤就像BaseClass.BaseClass()'由於其保護級別而無法訪問 – Anish 2012-07-26 12:54:16

10

如果我們將構造函數設置爲私有的,我們可以防止該類被派生出來嗎?

相當

public class NotReallySingleton 
{ 
    private NotReallySingleton() {} 

    public class CursesFoiledAgain : NotReallySingleton 
    { 
    } 
} 

... 

NotReallySingleton x = new CursesFoiledAgain(); 
NotReallySingleton y = new CursesFoiledAgain(); 

這工作,因爲private訪問僅限於該類型的程序文本,包括嵌套類型。因此CursesFoiledAgain可以訪問NotReallySingleton的私有構造函數。

但即使離開這個不談,如果你打算,沒有人可以從類派生,爲什麼你不希望儘可能清晰的信號這種意圖,通過sealed

+0

原諒我缺乏C#知識,但沒有'CursesFoiledAgain'需要擴展'NotReallySingleton',或者暗示通過成爲一個嵌套類型不像在Java? – 2012-07-27 02:24:12

+0

@DavidHarkness:對不起,不 - 這是一個錯字。它必須明確完成,我現在要修復:) – 2012-07-27 05:50:55

相關問題