我想知道为什么单例类应该被密封。如果我们将构造函数设置为私有,我们可以阻止派生类吗?.. 下面我从 MSDN 粘贴几行。请给我一些颜色。
在这个策略中,实例是在第一次引用类的任何成员时创建的。公共语言运行时负责变量初始化。该类被标记为密封以防止派生,这可能会添加实例。有关将类标记为密封的利弊的讨论,请参见 [Sells03]。此外,该变量被标记为只读,这意味着它只能在静态初始化期间(此处显示)或在类构造函数中分配。
我想知道为什么单例类应该被密封。如果我们将构造函数设置为私有,我们可以阻止派生类吗?.. 下面我从 MSDN 粘贴几行。请给我一些颜色。
在这个策略中,实例是在第一次引用类的任何成员时创建的。公共语言运行时负责变量初始化。该类被标记为密封以防止派生,这可能会添加实例。有关将类标记为密封的利弊的讨论,请参见 [Sells03]。此外,该变量被标记为只读,这意味着它只能在静态初始化期间(此处显示)或在类构造函数中分配。
如果我们将构造函数设为私有,我们可以防止类被派生,对吗?
不完全:
public class NotReallySingleton
{
private NotReallySingleton() {}
public class CursesFoiledAgain : NotReallySingleton
{
}
}
...
NotReallySingleton x = new CursesFoiledAgain();
NotReallySingleton y = new CursesFoiledAgain();
这是可行的,因为private
访问仅限于该类型的程序文本,包括嵌套类型。所以CursesFoiledAgain
可以访问NotReallySingleton
.
但是,即使撇开这一点不谈,如果您的意图是没有人可以从该类派生,您为什么不想通过 尽可能清楚地表明该意图sealed
?
关键字表示该类sealed
不能被继承。将构造函数声明为私有意味着无法创建该类的实例。
这些不是一回事。您可以拥有一个带有私有构造函数的基类,但仍从该基类继承,定义一些公共构造函数,并有效地实例化该基类。
请记住,构造函数不是继承的(因此派生类不会仅仅因为基类有所有私有构造函数),并且派生类总是首先调用基类构造函数。标记类sealed
可以防止某人在您精心构建的单例类周围进行琐碎的工作,因为它可以防止某人从该类继承。
这是一种设计指南,很明显,你可以遵循也可以不遵循。这只是标记您的设计意图,例如在基类标记它的情况下,abstract
以避免将来可能出现混乱。