2012-01-05 15 views
1

私は、これはコンパイルされません内部クラスから継承するパブリッククラスを使用できないのはなぜですか?

public abstract class Base { } 
internal class Common : Base { } 
public class Instance : Common { } 

の下に展示アクセシビリティの限界を理解していません。

一貫性のないアクセス:基本クラスの一般的な」は、クラスのインスタンス 'より少ないアクセス可能です

私は共通の公開抽象クラスに何を望むかを達成することができますが、なぜ私は単に名前を公開しないことができません全く?

編集:私が求めているのは、WHYこの方法で動作します!誰もがルールが何であるかに答えているのですが、なぜルールがそのようなのか説明していません。

+2

もっと明確にすることはできますか? –

+0

Commonを隠すのはなぜですか?抽象クラスはインスタンス化することはできません.. – alexm

+1

それは何のエラーでコンパイルされませんか? – gideon

答えて

3

クラスの継承者は、基本クラスのアクセシビリティの範囲を広げることはできません。

公共:アクセス 内部に限定されない:一度プログラムに限定

、すべての相続、このプログラムへのアクセス制限され、internal classinternal残るか、あまりアクセス(protected internalまたはprivate)を想定しなければなりません。

C# specificationパー

、セクション§3.5.4アクセシビリティの制約

インスタンスコンストラクタのパラメータ型は、インスタンスコンストラクタ自体として少なくとも としてアクセスできる必要があります。例で

class A {...} 

public class B: A {...} 

コンパイル時エラーにBクラス結果Aは、B

また

少なくとも としてアクセスできないため:

クラス型の直接基底クラスは、少なくともクラス型自体(§3.5.2)としてアクセス可能である必要があります。 たとえば、パブリッククラスがプライベートクラスまたは内部クラスから派生するのは、コンパイル時に エラーです。

あなたは、あなたが外部コードにアクセスできるようにしたくない機能を持つ Commonクラスを作成しようとしている場合は、 prefer composition over inheritanceをする必要があります。たとえば、次のように

public abstract class Base 
{ 
... 
} 

internal class Common : Base 
{ 
... 
} 

public class Instance 
{ 
    internal Instance(Common common) 
    { 
     ... 
    } 
... 
} 
+0

インスタンスのコンストラクタとパラメータの型に関するビットは、質問やコードスニペットとは特に関係ないことに注意してください。これは、その特定のセクションの多くの最後の箇条書きです。これに関連する箇条書きは実際には最初のもので、後の仕様で見つかる2番目の引用部分と一致します。 –

0

Commonは、プロパティが含まれていた場合、Fooを言うことができます:

public string Foo { get; set; } 

Instanceクラスは自動的にそのプロパティを公開するよりも。あなたはそれをこのように考えることができます。

public void Test() 
{ 
    Common myInstance = new Instance(); 
    System.Console.WriteLine(myInstance.Foo); 
} 

Instanceので、ニーズが基底クラスのアクセス修飾子は以下の露光できない、持っているCommonすべてを公開します。

ただし、内部では同じように処理するために、Fooプロパティを作成することはできます。

2

他のアセンブリとのコードの見え方の問題です。 Commonを内部にすることで、アセンブリへのCommonへのアクセスが制限されますが、Instanceを公開することで、インスタンスは任意の参照アセンブリにアクセス可能になります。参照アセンブリが型の基本クラスにアクセスできない場合、その基本クラスから継承したメンバにどのようにアクセスできますか?

関連する問題