2017-08-02 16 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クラスが基本クラスを意図することができないようにプライベートクラスのみを入れました。パラメータなしのコンストラクタをprotectedとして配置し、Derivedクラスがそれを使用できるようにします。 – JBO

+0

「プライベート」の意味を明確に説明している[The documentation](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/private)も参照してください。私。メンバは宣言されている型によってのみアクセスできます。派生クラスはコンストラクタを含む基本クラスのprivateメンバーにアクセスできません。これは 'private'コンストラクタが呼び出せないことを意味するわけではなく(非プライベートコンストラクタによって呼び出される可能性もあります)、継承されないことを意味しません(非プライベートコンストラクタも提供できます)。 –

答えて

3

クラスをインスタンス化するコンストラクタが必要なため、コンストラクタは派生させたいクラスによってプライベートに保持されます。クラス自体を除いて誰もそれにアクセスすることはできません。それが存在しないことはすべて知っている!たとえば、シングルトンパターンにプライベートコンストラクタを使用するとよいでしょう。

継承を許可したいが、コンストラクタが外部から呼び出されないようにするには、protectedキーワードが必要です。

0

private修飾子を使用すると、別のクラスのものにアクセスすることはできません。派生クラスからでも

これを見てください:Access Modifiers

プライベート

型またはメンバーは、同じクラスまたは 構造体にのみコードによってアクセスすることができます。

そしてBaseコンストラクタはDerivedのインスタンスは、あなたがあなたのケースでprivateを使用することはできません作成されたときに呼び出される必要があるため。代わりにprotectedを使用してください。

関連する問題