Почему конструкторы на абстрактных классах должны быть защищены, а не публично?
ReSharper предлагает изменить доступность конструктора public
в классе abstract
до protected
, но в нем не указано обоснование этого.
Можете ли вы пролить свет?
Ответы
Ответ 1
Просто потому, что общественность не имеет смысла в абстрактном классе. Абстрактный класс по определению не может быть создан непосредственно. Он может быть создан только экземпляром производного типа. Поэтому единственными типами, которые должны иметь доступ к конструктору, являются его производные типы и, следовательно, защита имеет гораздо больше смысла, чем общедоступность. Он более точно описывает доступность.
Ответ 2
Это технически не имеет никакого значения, если вы создадите конструктор public
вместо protected
в абстрактном классе. Доступность/видимость конструктора по-прежнему одинакова: один и тот же класс или производные классы. Два ключевых слова имеют неотличимые эффекты для всех целей и целей.
Итак, этот выбор - это только вопрос стиля: type protected
для удовлетворения объектно-ориентированных опытных людей.
Отражение по умолчанию будет включать конструктор только в том случае, если оно public
, но вы все равно не можете вызвать этот конструктор.
IntelliSense покажет конструктор public
при вводе new
, но вы все равно не можете вызвать этот конструктор.
Метаданные сборки будут отражать тот факт, что конструктор является общедоступным или защищенным.
Ответ 3
Это хорошая практика OO.
public abstract class ExampleAbstractClass
{
protected ExampleAbstractClass()
{
// :::
}
}
Вы хотите, чтобы наследующие дочерние классы имели доступ к конструктору. Единственный способ сделать это - сделать конструктор защищенным.
Имейте в виду, что когда вы добавляете параметры к этим конструкторам, это совершенно другое обсуждение.