我想知道为什么要密封单例类。如果我们将构造函数设置为私有,我们可以阻止类派生吗?..下面我从MSDN粘贴几行。请给我一些颜色..
在此策略中,实例是在第一次引用类的任何成员时创建的。公共语言运行库负责变量初始化。该类被标记为密封以防止派生,这可能会添加实例。有关标记类密封的优缺点的讨论,请参阅[Sells03]。此外,变量标记为只读,这意味着它只能在静态初始化(这里显示)或类构造函数中分配。
答案 0 :(得分:10)
如果我们将构造函数设置为私有,我们可以阻止该类派生吗?
不相当:
public class NotReallySingleton
{
private NotReallySingleton() {}
public class CursesFoiledAgain : NotReallySingleton
{
}
}
...
NotReallySingleton x = new CursesFoiledAgain();
NotReallySingleton y = new CursesFoiledAgain();
这是有效的,因为private
访问仅限于该类型的程序文本,包括嵌套类型。因此CursesFoiledAgain
可以访问NotReallySingleton
的私有构造函数。
但是即使把它放在一边,如果你的意图是没有人可以从课程中得到的,为什么你不想通过sealed
尽可能清楚地表明这个意图? ?
答案 1 :(得分:2)
sealed
关键字表示无法继承该类。将构造函数声明为private意味着无法创建类的实例。
这些不是一回事。您可以拥有一个带有私有构造函数的基类,但仍然从该基类继承,定义一些公共构造函数,并有效地实例化该基类。
请记住,构造函数不是继承的(因此派生类不会仅仅因为基类而具有所有私有构造函数),并且派生类总是首先调用基类构造函数。标记类sealed
可以防止有人轻易地在你精心构造的单例类中工作,因为它会阻止某人继承该类。
答案 2 :(得分:1)
c#中的private构造函数将仅帮助我们防止类的任何外部实例化,而sealed关键字将阻止类的继承。假设您有任何嵌套的类,并且如果尚未将类声明为密封的,则可以创建该类的实例。看看this article。
答案 3 :(得分:0)
这是一种设计指南,显然,您可以遵循与否。这只是标记您的设计意图,就像基类将其标记为abstract
一样,以避免将来可能发生混乱。