Актуальность «публичного» конструктора в абстрактном классе - PullRequest
16 голосов
/ 30 апреля 2010

Есть ли какое-то отношение к публичному конструктору в абстрактном классе? Я не могу придумать какой-либо возможный способ его использования, в этом случае компилятор не должен рассматривать его как ошибку (C #, не уверен, что другие языки допускают это).

Пример кода:

internal abstract class Vehicle
{
    public Vehicle()
    {            
    }
}

Компилятор C # позволяет компилировать этот код, хотя я не могу вызвать этот конструктор из внешнего мира. Он может быть вызван только из производных классов. Поэтому не следует разрешать только «защищенные» и «приватные» модификаторы. Пожалуйста, прокомментируйте.

Ответы [ 4 ]

6 голосов
/ 30 апреля 2010

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

3 голосов
/ 20 декабря 2012

Внутри абстрактного класса для конструктора экземпляра все модификаторы public, protected internal и protected эквивалентны.Тогда internal является более строгим, чем они, и private является наиболее строгим доступом.

Если все конструкторы экземпляров private, то наследовать могут только классы, вложенные в рассматриваемый класс.*

Примечание. Если конструкторы экземпляров не указаны для нестатического класса, компилятор сам его сгенерирует.Это конструктор, принимающий нулевые аргументы.Если класс абстрактный, этот автоматически сгенерированный конструктор имеет вид protected.В противном случае это public.

Единственная ситуация, в которой я могу думать, где это имеет значение, если конструктор экземпляра абстрактного класса - public или protected, - это когда вы используете отражение.Например, выражение

ConstructorInfo[] ctors = typeof(Vehicle).GetConstructors();

даст пустой массив, если единственным конструктором является protected, и массив длины-1, если он public.Но, конечно, есть перегрузки, которые задают BindingFlags, так что это не проблема, просто что-то, что нужно запомнить, если использовать отражение.

1 голос
/ 30 апреля 2010

Dupe: есть еще один вопрос по SO, такой: Модификатор доступа к конструктору абстрактных классов

В конце концов ответы на этот вопрос сводятся к одному и тому же: не имеет значения, объявите ли вы это protected или public.

Также, кажется, в литературе обсуждается это (например, в Framework Design Guidelines ). На это ссылаются в этом посте: Хороший дизайн или плохой дизайн абстрактного класса?

1 голос
/ 30 апреля 2010

Да, public ctor в абстрактном классе не имеет смысла и немного вводит в заблуждение, поскольку он будет вести себя как защищенный, поскольку только производные классы могут вызывать его.

A private ctor будет иметь небольшое значение вне интересных краевых случаев.

A protected ctor будет иметь смысл, если этого требуют производные классы.

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