Защищенные классы в .NET - PullRequest
34 голосов
/ 19 июня 2009

Может ли класс быть защищен в .NET?
Почему это невозможно?

Ответы [ 4 ]

71 голосов
/ 19 июня 2009

Да, вы просто не можете сделать их классами верхнего уровня, они должны быть внутренними классами

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 просто 'Public' или 'NonPublic' (как показывают флаги Reflection.Emit )

11 голосов
/ 19 июня 2009

protected видимость используется для обозначения «видимого для производных классов». Это имеет смысл для вещей внутри класса, но обычно не имеет значения на уровне класса.

Единственным исключением является внутренний класс, где защищенная видимость означает, что производные классы будут иметь доступ к внутреннему классу.

2 голосов
/ 19 июня 2009

Да, мы просто не можем сделать их классами верхнего уровня, они должны быть внутренними классами

0 голосов
/ 06 июня 2018

Защищенный класс не может быть определен внутри пространства имен. Он может быть объявлен только как вложенный класс. Его можно создать в других вложенных классах, наследовать от других вложенных классов и наследовать от других вложенных классов.

К защищенному члену родительского класса могут обращаться вложенные классы, а также классы, наследуемые от родительского класса (производного класса или дочернего класса).

...