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

Cri*_*scu 45 .net c# oop inheritance access-modifiers

ReSharper建议改变类中public构造函数的可访问性,但它没有说明这背后的基本原理.abstractprotected

你能解开一些光吗?

Jar*_*Par 78

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

  • 换句话说:为什么你想用无用的垃圾污染其他人的智能感知? (14认同)
  • 所以,鉴于此,编译器是否应该强制抽象类**不能**具有`public`构造函数? (10认同)
  • @Andre构造函数仅在intellisense中显示新调用和基本调用.通常在考虑可访问性之前将抽象类过滤掉,因为检查抽象非常容易且便宜. (4认同)

Dan*_*ker 15

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

因此,这种选择只是风格问题:protected满足面向对象的精明人的类型.


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

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

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

  • 他的回答给出了两者之间的功能差异,这正是我所寻找的.是否真实无关紧要,除此之外,c#语言需要解决的问题,而不是开发人员. (2认同)