我们可以继承单身类吗?
答案 0 :(得分:18)
这取决于实施。单身人士通常有私人构造函数,可能标记为sealed
,如果是这样,那么你就不能。如果它至少受到保护,你可以。如果你只是从单例类继承,那么结果将不是单例,所以你应该遵循模式并使它也是单例。
答案 1 :(得分:2)
如果你不能从单例类继承,你也可以只使用静态方法,属性,字段和事件来实现该类。
能够通过基类的静态方法(或属性)访问派生类的对象是Singleton模式的关键概念之一。引用设计模式:可重用面向对象软件的元素(Gamma等人):
适用性
时使用单例模式
- 必须只有一个类的实例,并且客户必须可以从众所周知的访问点访问它。
- 当唯一实例应该可以通过子类化进行扩展时,客户端应该能够使用扩展实例而无需修改其代码。
(我强调)
答案 2 :(得分:2)
是的,你可以。保持基类构造函数受保护(而不是私有)。
然后可以实例化派生类,但基类不能(甚至在派生类的函数定义内)。我试过这个并且效果很好。
答案 3 :(得分:2)
这是处理派生单身人士的可能方法:
public abstract class Singleton<T> where T : Singleton<T>, new() {
private static readonly T s_instance = new T();
protected Singleton() {
if (s_instance != null) {
string s = string.Format(
"An instance of {0} already exists at {0}.instance. " +
"That's what \"Singleton\" means. You can't create another.",
typeof(T));
throw new System.Exception(s);
}
}
public static T instance { get { return s_instance; } }
}
public class MyClass : Singleton<MyClass> {
}
答案 4 :(得分:0)
不确定。为什么不?继承类将是基本Singleton类的特化。
每个类(基类和专用类)的实例将完全分开。换句话说,他们的实例成员将指向单独的对象。
答案 5 :(得分:0)
只有单例类本身才能创建实例......所以我认为答案不是。我想你可以做到,但那时它不再是单身人士了:D