为什么单身类应该密封?

Ani*_*ish 7 .net singleton design-patterns class-design sealed

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

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

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

Jon*_*eet 11

如果我们将构造函数设置为私有,我们可以阻止类派生吗?

完全:

public class NotReallySingleton
{
    private NotReallySingleton() {}

    public class CursesFoiledAgain : NotReallySingleton
    {
    }
}

...

NotReallySingleton x = new CursesFoiledAgain();
NotReallySingleton y = new CursesFoiledAgain();
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为private访问仅限于该类型的程序文本,包括嵌套类型.所以CursesFoiledAgain可以访问私有构造函数NotReallySingleton.

但即使把这个放在一边,如果你的意图是没有人可以从课堂上得到,为什么你不想通过这种方式尽可能清楚地表明这种意图sealed呢?


sll*_*sll 0

这是一种设计指南,显然你可以遵循也可以不遵循。这只是标记您的设计意图,就像基类标记它的情况一样,以abstract避免将来可能出现的混乱。