Защищенное ключевое слово C # - PullRequest
15 голосов
/ 02 сентября 2010

Я хочу знать, что означает protected в C #, почему мы его используем и в чем преимущество ключевого слова?

Например,

protected int currentColorIndex;

Пожалуйста, уточните.

Ответы [ 7 ]

38 голосов
/ 02 сентября 2010

Каждый ответ похож (определение и / или выдержка / ссылка на MSDN), поэтому я попытаюсь ответить на ваши первоначальные 3 вопроса:

Значение:

Любое поле, помеченное как защищенное, означает, что оно видно только себе и всем дочерним элементам (классам, которые наследуют его). Вы заметите, что в коде ASP.NET Web Forms для модели обработчики событий (например, Page_Load) помечены как защищенные. Это связано с тем, что файл разметки ASPX на самом деле наследует от файла с выделенным кодом (для доказательства посмотрите директиву @Page).

Почему мы это используем:

Распространенным применением модификатора защищенной доступности является предоставление детям доступа к его родительским свойствам. У вас может быть базовый класс, для которого происходит множество подклассов. Этот базовый класс может иметь общее свойство. Это хороший случай для защищенного свойства - для облегчения повторного использования и централизованного обслуживания общей логики.

Преимущество:

Похоже на вопрос "почему мы его используем?" Но по сути это дает грубый контроль над свойствами. Вы не можете просто думать о том, «когда вы используете защищенный». Это больше случай выбора, когда использовать какой модификатор доступности (приватный, публичный, внутренний, защищенный). Таким образом, преимущество - это то же самое преимущество любого модификатора доступности - обеспечивает надежную и согласованную объектную модель, максимизирующую повторное использование кода и минимизирующую риски безопасности, связанные с некорректно представленным кодом.

Надеюсь, это поможет.

17 голосов
/ 02 сентября 2010

Как уже отмечали другие:

Защищенное ключевое слово является модификатором доступа члена.Защищенный член доступен в своем классе и экземплярах производного класса.

Вот небольшой пример:

public class A
{
    protected string SomeString;
    public string SomeOtherString;
}

public class B : A
{
    public string Wrapped
    {
        get { return this.SomeString; }
    }
}

...

var a = new A();
var s = a.SomeOtherString; // valid
var s2 = a.SomeString; // Error

var b = new B();
var s3 = b.Wrapped; // valid
13 голосов
/ 02 сентября 2010

"Защищенный член доступен из в классе, в котором это объявлен, и из любого класса происходит от класса, который объявил этот участник. "

см

http://msdn.microsoft.com/en-us/library/bcd5672a(VS.71).aspx

7 голосов
/ 02 сентября 2010

Определение приведено в другом ответе. Почему это хорошо? Вам не нужно дублировать данные / код из базового класса в его производные классы, когда protected предлагает им доступ к реализациям базового класса без нежелательного воздействия неограниченного внешнего использования, которое будет подразумеваться public.

7 голосов
/ 02 сентября 2010

Прямо от MSDN:

Защищенное ключевое слово является модификатором доступа участника. Защищенный член доступен в пределах своего класса и экземплярами производного класса.

Источник

Использование защищенного означает, что вы можете иметь функциональность в классе, который доступен для производных классов, но не для классов, которые просто создают экземпляр объекта.

На этой странице сравниваются различные модификаторы доступа, объясняется их значение и приводится таблица модификаторов по умолчанию для различных объектов (перечисление, класс, интерфейс и структура).

4 голосов
/ 02 сентября 2010

Это означает, что поле видно только самому классу и унаследованным классам.

3 голосов
/ 02 сентября 2010

Думайте об этом так. Класс представляет три интерфейса:

  1. На пути к самой , с полным доступом к внутренним деталям реализации (публичные, защищенные, приватные методы и атрибуты). По определению, все, что вы делаете в классе, может повлиять на все остальное.
  2. На пути к клиентам с доступом только к открытым методам и атрибутам. Вы минимизируете открытый интерфейс класса, чтобы минимизировать непредвиденные последствия изменений: чем меньше кода знает о ваших внутренних элементах, тем свободнее вы можете изменить их позже.
  3. На пути к потомкам , с доступом к общедоступным и защищенным методам и атрибутам. Что бы вы ни делали с защищенными и общедоступными методами, это повлияет не только на клиентов, но и на потомков, которые изменяют базовую функциональность вашего класса. ОО означает уменьшение связности и увеличение связности : нет более сильной связи между классами, чем отношение наследования (ну, кроме C ++ friend, Конечно!)

Третий интерфейс - самая сложная общая задача проектирования в ОО: что может быть разумно переопределено (виртуальные методы и свойства), и для того, чтобы переопределить, какие другие функции необходимы (простые защищенные методы и атрибуты)? Поскольку это такая сложная задача, иметь классы sealed по умолчанию - это действительно хорошая идея, противоречащая интуитивному пониманию, как это часто кажется новичкам в ОО, которым это кажется ненужным препятствием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...