FxCop抽象类型在没有new时不应该有构造函数

时间:2010-11-26 11:03:56

标签: .net vb.net fxcop abstract

我遇到了FxCop和警告的问题:Abstract types should not have constructors

这是针对许多抽象类显示的(可能全部,我还没有检查过)。当我看起来他们中的大多数没有新的方法所以我认为它是编译器添加默认方法。所以要删除它我添加一个私有默认的构造函数(Private Sub New()),这意味着所有的inherting类都无法构建错误: Class 'InheritingClass' has no accessible 'Sub New' and cannot be inherited.

这看起来很奇怪,因为FxCop请求没有公共构造函数,但是当我删除它时,构建失败。

1 个答案:

答案 0 :(得分:6)

尝试将 protected ,无参数构造函数添加到抽象类中。

如果您不提供构造函数,编译器会为您添加 public ,无参数。显然,抽象类不适合使用公共构造函数,因为它们有效保护 - 抽象类型的构造函数最多可以被子类调用(这就是抽象类型的整点 - 它不能被实例化为'vanilla')。这个设计缺陷是导致FxCop抱怨的原因。

另一方面,你采取的解决问题的步骤太过极端;具有私有构造函数的类(抽象或非抽象)在实践中不是子类(除了嵌套类) - 没有隐式或显式base(...)构造函数调用可能在派生类的构造函数。

编辑:我喜欢this MSDN page提出的方式:

  

在上面的例子中,抽象类型有   一个公共构造函数,可以   混淆用户。他们看到了公众   构造函数,但不明白为什么   他们无法创建类型。