2017-08-02 34 views
0

我找不到在C#中不允許從基類繼承私有無參數構造函數的原因。以下是最簡單的示例:爲什麼從具有私有構造函數的類繼承是不允許的

public class Base 
    { 
    private Base() 
    { 
    } 

    public string Name { get; set; } 
} 

public class Derived : Base 
{ 
    public Derived(string name) 
    { 
    base.Name = name; 
    } 
} 

編譯器不會編譯此代碼。爲什麼這樣?這個類當然不是密封的,雖然基類不需要多次實例化(就像在Singleton中一樣),但我認爲派生類有很多次都可以用參數化構造函數實例化。 在這種情況下爲什麼不允許繼承?

+0

從外部看來,基類沒有構造函數,如果它們在同一個項目中我敢打賭內部函數:) – EpicKip

+0

只要你從一個類繼承,這個類需要有可訪問的構造函數。但是你只放了一個私人的類,所以你的Derived類將無法聲明它的基類。將您的無參數構造函數設置爲受保護,以允許您的Derived類使用它。 – JBO

+0

另請參閱[文檔](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/private),它清楚地解釋了「private」的含義。即該成員只能通過聲明的類型訪問。派生類不能訪問基類的_any_「private」成員,包括構造函數。請注意,這並不意味着'private'構造函數不能被調用(它可以被非私有構造函數調用),也不意味着該類不能被繼承(它也可以提供非私有構造函數)。 –

回答

3

因爲您需要一個構造函數來實例化一個類,並且構造函數由您想要派生的類保持私有。除了課程本身,沒有人可以訪問它。對於所有它知道它不存在! (例如,您可能想要爲單例模式使用私有構造函數)

如果要允許繼承,但不讓構造函數從外部調用,則需要使用protected關鍵字。

0

如果使用private修飾符,則無法訪問另一個類中的某些內容;甚至來自派生類。

看一看這樣的:Access Modifiers

私人

的類型或成員只能由相同的類或 結構代碼訪問。

而且因爲Base構造的時候了Derived一個實例將被創建,你不能在你的情況下使用private被調用。您應該改用protected

相關問題