【发布时间】:2010-10-20 04:44:23
【问题描述】:
ReSharper 建议将 abstract 类中 public 构造函数的可访问性更改为 protected,但并未说明其背后的基本原理。
你能解释一下吗?
【问题讨论】:
标签: c# .net oop inheritance access-modifiers
ReSharper 建议将 abstract 类中 public 构造函数的可访问性更改为 protected,但并未说明其背后的基本原理。
你能解释一下吗?
【问题讨论】:
标签: c# .net oop inheritance access-modifiers
仅仅是因为在抽象类中公开是没有意义的。根据定义,抽象类不能直接实例化。它只能由派生类型的实例实例化。因此,唯一应该可以访问构造函数的类型是它的派生类型,因此受保护比公共更有意义。它更准确地描述了可访问性。
【讨论】:
public构造函数吗?
如果您在抽象类上创建构造函数public 而不是protected,从技术上讲,这没有任何区别。构造函数的可访问性/可见性仍然完全相同:相同的类或派生类。这两个关键字在所有意图和目的上都具有无法区分的效果。
所以,这个选择只是风格问题:输入protected 以满足精明的面向对象的人。
默认情况下,反射只会包含 public 的构造函数,但无论如何你都不能调用该构造函数。
IntelliSense 将在键入 new 时显示 public 构造函数,但无论如何您都无法调用该构造函数。
程序集的元数据将反映构造函数是公共的还是受保护的这一事实。
【讨论】:
public 是不真实的。
这是很好的 OO 实践。
public abstract class ExampleAbstractClass
{
protected ExampleAbstractClass()
{
// :::
}
}
您只希望继承的子类可以访问构造函数。做到这一点的唯一方法是使构造函数受到保护。
请记住,当您向这些构造函数添加参数时,这是一个完全不同的讨论。
【讨论】:
: base(...) 并传递一些东西,但这些东西也可以是从其他地方检索到的常量或值。