我们可以继承单身人士班吗?

时间:2010-08-25 10:08:57

标签: c# .net design-patterns

我们可以继承单身类吗?

6 个答案:

答案 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