在我的场景中,抽象和受保护的区别是什么 - C#

时间:2012-07-17 20:41:46

标签: c# .net

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

这两个场景都是编译和工作的,但是我不明白在哪种情况下使用哪个更好。我已经习惯了解虽然你不能直接实例化一个抽象类(只能通过一个非抽象的子类),但抽象类通常应该包含需要由该类的子类实现的抽象函数。

在公共类中没有受保护的构造函数表示不可能实例化此类(这是我们唯一的构造函数)。

4 个答案:

答案 0 :(得分:10)

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

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

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

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

因此,答案是您应将班级标记为abstract

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

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

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

答案 1 :(得分:6)

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

使用abstract表明它确实是一个抽象类。只是一个protected构造函数并不清楚。

除了子类之外,其他任何东西都不能调用abstract构造函数;离开它public是没有意义的。

答案 2 :(得分:4)

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

答案 3 :(得分:0)

带有受保护或内部构造函数的公共抽象类传达了调用代码使用它的方式。使用不可访问的构造函数实际上可能会令人困惑。