为什么抽象类的构造函数应该受到保护而不是公开?

时间:2009-04-17 19:31:19

标签: c# .net oop inheritance access-modifiers

ReSharper建议将public类中的abstract构造函数的可访问性更改为protected,但并未说明此背后的基本原理。

你能解决一些问题吗?

3 个答案:

答案 0 :(得分:73)

仅仅因为公开在抽象课中毫无意义。根据定义,抽象类不能直接实例化。它只能由派生类型的实例实例化。因此,唯一应该访问构造函数的类型是它的派生类型,因此受保护比公共更有意义。它更准确地描述了可访问性。

答案 1 :(得分:14)

如果在抽象类上创建构造函数public而不是protected,那么技术上没有任何区别。构造函数的可访问性/可见性仍然完全相同:相同的类或派生类。对于所有意图和目的,这两个关键字具有无法区分的效果。

所以,这个选择只是风格问题:输入protected来满足面向对象的精明人。


默认情况下,反射只包含public时的构造函数,但无论如何都无法调用该构造函数。

IntelliSense将在键入public时显示new构造函数,但无论如何都无法调用该构造函数。

程序集的元数据将反映构造函数是公共的还是受保护的。

答案 2 :(得分:-1)

这是好的OO练习。

public abstract class ExampleAbstractClass
{
    protected ExampleAbstractClass()
    {
      // :::
    }
}

您只希望继承子类可以访问构造函数。唯一的方法是使构造函数受到保护 请记住,当您向这些构造函数添加参数时,这是一个完全不同的讨论。