Вопрос по abstract-class, constructor, c# – Чем полезны публичные конструкторы в абстрактных классах в C #?

27

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

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

Ваш Ответ

3   ответа
3

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

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

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

22

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

РЕДАКТИРОВАТЬ: нет, компилятор не делаетне жалуются, но такие инструменты, как FxCop (& Анализ кода) сделать. Я считаю, что есть некоторые странные трюки с отражением, которые вы можете сделать с открытыми конструкторами в абстрактных классах, но с точки зрения, когда вы просто предоставляете функциональность базового класса другим разработчикам, пишущим подклассы, придерживайтесь защищенного конструктора.

согласовано. Это более подробно:stackoverflow.com/questions/2700256/... Gaurav Aroraa
4

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

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

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

Есть некоторые крайние случаи с отражением, которые можно упростить, сделав конструкторы абстрактных классов публичными ... но они 'исключительно редкий. Я в целом согласен, что конструкторы в абстрактных классах должны быть защищены (или частными, если они вызываются другими перегрузками конструктора). LBushkin

Похожие вопросы