Есть ли какая-либо уместность 'общедоступного' конструктора в абстрактном классе? Я не могу думать ни о каком возможном способе использовать его, в этом случае не был должен это рассматриваться как ошибку компилятором (C#, не уверенный, если другие языки позволяют это).
Пример кода:
internal abstract class Vehicle
{
public Vehicle()
{
}
}
Компилятор C# позволяет этому коду компилировать, в то время как нет никакого способа, которым я могу вызвать этого конструктора от внешнего мира. Это можно назвать от производных классов только. Так не был должен это позволять 'защищенные' и 'частные' модификаторы только. Прокомментируйте.
Нет причин для открытого конструктора для абстрактного класса.Я предполагаю, что причина, по которой компилятор не жалуется, настолько проста, что они просто не потратили время на это, поскольку на самом деле не имеет значения, является ли он общедоступным или защищенным.
Дуп: есть еще один вопрос по SO, вот так: Модификатор доступа к конструктору абстрактного класса
Ответы на этот вопрос в конечном итоге сводятся к одному и тому же: на самом деле не имеет значения, объявляете ли вы это защищенный
или общедоступный
.
Также, кажется, есть некоторые дискуссии об этом в литературе (например, в Framework Design Guidelines ). Об этом говорится в этом сообщении блога: Хороший или плохой дизайн абстрактного класса?
Да, public
ctor в абстрактном классе не имеет смысла и немного вводит в заблуждение, поскольку он будет вести себя как protected, т.е. только производные классы могут его вызывать.
А private
ctor будет иметь мало смысла за пределами интересных крайних случаев.
Ктор protected
будет иметь смысл, если он требуется производным классам.