12

具有公共构造函数的公共抽象类与具有受保护构造函数的公共类之间有什么区别。我们的抽象类中没有任何抽象函数,但我们希望程序员只能创建扩展该类的对象。

两种场景都可以编译和工作,但是我不明白在什么场景中使用哪个会更好。我从小就明白,虽然你不能直接实例化抽象类(只能通过非抽象子类),但抽象类通常应该包含该类的子类需要实现的抽象函数。

在公共类中没有受保护的构造函数是否意味着无法实例化此类(这是我们拥有的唯一构造函数)。

4

4 回答 4

10

MSDN 声明关于使用abstract关键字来表示类:在类声明中使用 abstract 修饰符来指示一个类仅作为其他类的基类。也就是说,抽象类不需要包含任何抽象成员。修饰符只是一种明确的abstract方式,表示不应实例化该类,而不是存在技术障碍,例如使构造函数公开不可见。

请注意,您描述的技术障碍甚至有一个警告:它仍然可以称为:

  • 它可以从派生类中调用。
  • 可以使用反射来调用它。

两者都意味着其他只是(ab-?)使用您的类的开发人员可以做一些您不打算发生的事情,即实例化您的类,并且在使类抽象时两者都不可能。

因此,答案是您应该将您的课程标记为abstract.

请注意,建议您仍然保护抽象类的构造函数(强调该类不能被实例化)。如果抽象类具有公共构造函数,则 FxCop 等工具将输出警告。

这符合使每个成员与其真正需要的一样可见的一般规则。在抽象类中,永远不会从公共范围调用构造函数,因此public不需要可见性。它们只会被派生类的构造函数调用,因此protected抽象类中任何构造函数的合理可见性也是如此。

因此,还要创建抽象类的任何构造函数(最多)protected

于 2012-07-17T20:45:38.987 回答
6

我会用受保护的构造函数做一个公共抽象类。

Usingabstract清楚地表明它确实是一个抽象类。只是一个protected构造函数并不那么清楚。

除了子类之外,没有任何东西可以调用abstract构造函数;离开它有点毫无意义public

于 2012-07-17T20:43:59.913 回答
4

声明类中的静态方法仍然可以调用私有或受保护的构造函数。抽象类必须具有要实例化的派生类。例如,单例模式利用通过公共静态方法/属性调用的私有构造函数。

于 2012-07-17T20:45:50.983 回答
0

A public abstract class with a protected or internal constructor conveys how you want calling code to use it. Using a non-accessible constructor can be actually confusing.

于 2012-07-17T20:46:26.163 回答