Почему конструкторы на абстрактных классах должны быть защищены, а не публичны? - PullRequest
39 голосов
/ 17 апреля 2009

ReSharper предлагает изменить доступность конструктора public в классе abstract на protected, но в нем нет обоснования этого.

Можете ли вы пролить свет?

Ответы [ 3 ]

73 голосов
/ 17 апреля 2009

Просто потому, что быть публичным не имеет смысла в абстрактном классе. Абстрактный класс по определению не может быть создан непосредственно. Он может быть создан только экземпляром производного типа. Поэтому единственными типами, которые должны иметь доступ к конструктору, являются его производные типы и, следовательно, защищенный, имеет гораздо больший смысл, чем открытый. Более точно описывает доступность.

14 голосов
/ 18 марта 2013

Технически это не имеет значения, если вы создаете конструктор public вместо protected в абстрактном классе. Доступность / видимость конструктора все та же: тот же класс или производные классы. Два ключевых слова имеют неразличимый эффект для всех намерений и целей.

Итак, этот выбор зависит только от стиля: наберите protected, чтобы удовлетворить объектно-ориентированных подкованных людей.


Reflection по умолчанию будет включать конструктор, только когда он равен public, но вы все равно не можете вызвать этот конструктор.

IntelliSense покажет конструктор public при вводе new, но вы все равно не сможете вызвать этот конструктор.

Метаданные сборки будут отражать тот факт, что конструктор является открытым или защищенным.

0 голосов
/ 17 апреля 2009

Это хорошая ОО практика.

public abstract class ExampleAbstractClass
{
    protected ExampleAbstractClass()
    {
      // :::
    }
}

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

...