Подтвердить что ты не робот

Почему конструкторы на абстрактных классах должны быть защищены, а не публично?

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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


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

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

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

Ответ 3

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

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

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