59

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

你能解释一下吗?

4

3 回答 3

97

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

于 2009-04-17T19:33:30.623 回答
20

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

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


默认情况下,反射只会包含构造函数public,但无论如何您都不能调用该构造函数。

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

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

于 2013-03-18T14:24:07.247 回答
-2

这是一个很好的 OO 实践。

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

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

于 2009-04-17T19:39:38.300 回答