2009-11-05 2 views
25

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

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

Thanks

ответ

21

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

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

+0

согласовано. Это более подробно: http://stackoverflow.com/questions/2700256/why-cant-create-object-of-an-abstract-class –

2

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

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

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

4

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

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

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

+0

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