web-dev-qa-db-ja.com

.NETの保護されたクラス

クラスを.NETで保護できますか?
なぜ、これが可能ではないのですか?

35
Aarsh Thakur

はい、あなたはそれらをトップレベルのクラスにすることはできません、それらは内部クラスでなければなりません

public class Outer
{
    protected class Foo
    {
    }
}

これは問題ありません。つまり、Fooを参照できるクラスは、Outerのサブクラスだけです。

class X 
{
    // 'Outer.Foo' is inaccessible due to its protection level
    private void Flibble(Outer.Foo foo)
    {
    }
}

class X : Outer
{
    // fine
    private void Flibble(Outer.Foo foo)
    {
    }
}

外部レベルクラスのアクセス修飾子は他のアセンブリとの関連でそれらの可視性を定義するため、c#では外部クラスをプライベート、保護(または内部保護)として宣言できないことに注意してください。アセンブリ内でのみ(または、InternalsVisibleToを介して友達に)、またはアセンブリ外で具体的に表示されます。

したがって、ここでは一貫性のためにパブリック/内部識別子が使用されていますが、実際のILの状態は単に「パブリック」または「非パブリック」です( Reflection.Emitフラグが示すように )。

73
ShuggyCoUk

protected可視性は、「派生クラスから可視」を示すために使用されます。これはクラスの内部では意味がありますが、通常はクラスレベルでは意味がありません。

これに対する唯一の例外は内部クラスです。保護された可視性は、派生クラスが内部クラスにアクセスできることを意味します。

11
Nader Shirazie

はい、私たちはそれらをトップレベルのクラスにすることはできません、それらは内部クラスでなければなりません

2
Aarsh Thakur

保護されたクラスは名前空間内で定義できませんでした。ネストされたクラスとしてのみ宣言できます。他のネストされたクラス内でインスタンス化され、他のネストされたクラスによって継承され、他のネストされたクラスから継承できます。

親クラスの保護されたメンバーには、ネストされたクラスや、親クラスから継承したクラス(派生クラスまたは子クラス)からアクセスできます。

0
Vinay Chanumolu