为什么单身类应该密封?

时间:2012-07-26 11:35:22

标签: .net design-patterns singleton class-design sealed

我想知道为什么要密封单例类。如果我们将构造函数设置为私有,我们可以阻止类派生吗?..下面我从MSDN粘贴几行。请给我一些颜色..

  

在此策略中,实例是在第一次引用类的任何成员时创建的。公共语言运行库负责变量初始化。该类被标记为密封以防止派生,这可能会添加实例。有关标记类密封的优缺点的讨论,请参阅[Sells03]。此外,变量标记为只读,这意味着它只能在静态初始化(这里显示)或类构造函数中分配。

http://msdn.microsoft.com/en-us/library/ff650316.aspx

4 个答案:

答案 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一样,以避免将来可能发生混乱。