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

Какова полезность публичных конструкторов в абстрактных классах в С#?

Если публичный конструктор в абстрактном классе может быть вызван только их производными классами, он должен быть функционально эквивалентен защищенному конструктору. Правильно?

Есть ли разница в объявлении открытого конструктора вместо защищенного в абстрактном классе? Для чего вы его используете? Почему компилятор не жалуется?

Спасибо

4b9b3361

Ответ 1

Абсолютно верно. Вы должны одобрить защищенный конструктор.

EDIT: компилятор не жалуется, но такие инструменты, как FxCop (& Code Analysis), делают. Я считаю, что есть некоторые странные трюки с отражением, которые вы можете сделать с публичными конструкторами в абстрактных классах, но с точки зрения, когда вы просто предоставляете функциональность базового класса другим разработчикам, которые пишут подклассы, придерживайтесь защищенного конструктора.

Ответ 2

Вы правы. Открытый конструктор в абстрактном классе функционально эквивалентен защищенному конструктору.

Я предпочитаю использовать защищенный конструктор в этом случае.

Хотя, правда, компилятор не будет жаловаться на то, что вы это делаете, компилятор будет жаловаться на попытку создания экземпляра абстрактного класса. Visual Studio достаточно умен, чтобы не предоставлять Intellisense, если вы пытаетесь создать экземпляр абстрактного класса.

Ответ 3

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

Однако компилятор не будет жаловаться, потому что так много бесполезных вещей, которые вы можете записать в контексте С#, но не сможет проверить его логическое значение, он может только проверять правила разбора, для которых он установлен.

И уверены, что создатели С# сосредоточились на создании грамматики (правил) компиляции, которые являются фактическими вредными и нарушают использование языка.