12

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

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

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

4

3 回答 3

13

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

完全

public class NotReallySingleton
{
    private NotReallySingleton() {}

    public class CursesFoiledAgain : NotReallySingleton
    {
    }
}

...

NotReallySingleton x = new CursesFoiledAgain();
NotReallySingleton y = new CursesFoiledAgain();

这是可行的,因为private访问仅限于该类型的程序文本,包括嵌套类型。所以CursesFoiledAgain可以访问NotReallySingleton.

但是,即使撇开这一点不谈,如果您的意图是没有人可以从该类派生,您为什么不想通过 尽可能清楚地表明该意图sealed

于 2012-07-26T11:52:57.150 回答
2

关键字表示该类sealed不能被继承。将构造函数声明为私有意味着无法创建该类的实例。

这些不是一回事。您可以拥有一个带有私有构造函数的基类,但仍从该基类继承,定义一些公共构造函数,并有效地实例化该基类。

请记住,构造函数不是继承的(因此派生类不会仅仅因为基类有所有私有构造函数),并且派生类总是首先调用基类构造函数。标记类sealed可以防止某人在您精心构建的单例类周围进行琐碎的工作,因为它可以防止某人从该类继承。

于 2012-07-26T11:38:00.660 回答
0

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

于 2012-07-26T11:37:57.167 回答