FxCop Абстрактные типы не должны иметь конструкторов, когда нет новых - PullRequest
2 голосов
/ 26 ноября 2010

У меня проблема с FxCop и предупреждением: Abstract types should not have constructors.

Это отображается для ряда абстрактных классов (возможно, всех, я не проверял).Когда я смотрю, у большинства из них нет нового метода, поэтому я предполагаю, что компилятор добавляет метод по умолчанию.Поэтому, чтобы удалить его, я добавляю частный конструктор по умолчанию (Private Sub New()), это означает, что все наследующие классы не могут быть построены с ошибкой: Class 'InheritingClass' has no accessible 'Sub New' and cannot be inherited.

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

1 Ответ

6 голосов
/ 26 ноября 2010

Попробуйте вместо этого добавить в абстрактный класс защищенный конструктор без параметров.

Когда вы не предоставляете конструктор, компилятор добавляет public , без параметров для вас. Понятно, что для абстрактного класса неуместно иметь общедоступные конструкторы, так как они в любом случае эффективно защищены - конструкторы абстрактных типов могут в лучшем случае вызываться подклассами (вот и весь смысл абстрактного типа - он не может быть создан как «ваниль»). Этот недостаток дизайна - то, что заставляет FxCop жаловаться.

С другой стороны, шаг, который вы сделали, чтобы решить проблему, был слишком экстремальным; классы (абстрактные или нет), которые имеют только частные конструкторы, на практике не подклассифицированы (кроме как вложенным классом) - не существует неявного или явного base(...) вызова конструктора, который мог бы работать в производном классе конструктор.

РЕДАКТИРОВАТЬ: мне нравится, как эта страница MSDN выражает это:

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

...