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

Соответствие "публичного" конструктора в абстрактном классе

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

Пример кода:

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

Компилятор С# позволяет компилировать этот код, хотя я не могу назвать это contructor из внешнего мира. Его можно вызывать только из производных классов. Поэтому не следует допускать модификаторы "protected" и 'private'. Прокомментируйте.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Также, по-видимому, в литературе обсуждается это (например, в Руководство по разработке каркаса). Об этом говорится в этом блоге: Хороший дизайн или плохой дизайн абстрактного класса?