返回后代的单例实例

时间:2012-01-23 12:31:20

标签: c# inheritance static singleton

我有几个单例类,所以我尝试使用方法GetInstance(params)和派生类创建一个父BaseClass,它应该实现这个方法并返回自己的实例(所以我不必抛出它们)。 ..因为它们是单例,所以该方法应该是静态的,但不允许覆盖静态方法。编码它的最佳方法是什么?示例代码我想要的:

  public class Base {

    public static virtual T GetInstance<T>() where T : class;
  }


  public class Derived {
    Derived instance;

    public static override T GetInstance<T>() where T : typeOf(this){
      if (instance == null) {
        instance = new Derived();
        }
      return instance;
    }
  }

在我之外的代码中我想打电话

Derived.GetInstance().SomeDerivedMethod()

(Derived.GetInstance() as Derived).SomeDerivedMethod() and not
new Derived().getInstance().SomeDerivedMethod()

我知道这不好,而且我对T型也缺乏经验,所以欢迎任何建议。 感谢

修改

或者如果有可能以某种方式在Base中定义GetInstance()方法,那么派生类不需要对它进行ovwerride,但是它将从调用它的位置返回类的实例... Derived.GetInstance()将返回Derived

的实例

4 个答案:

答案 0 :(得分:3)

尝试抽象工厂设计模式。也许其他creational design patterns也可能适合。

您需要在工厂级别强制执行“singleton-ness”,然后调用可能如下所示:

FooFactory.GetBarInstance().SomeDerivedMethod();

答案 1 :(得分:3)

您可以使用Dictionary<Type, Object>作为单身人士。下面的方法要求每种类型都实现构造函数private。当然,如果单例字典中已经存在该类的实例,您还可以检查每个派生类。这甚至可以避免某人使用Activator来创建实例。

未经测试:

public class Base {
    static Dictionary<Type, Object> _Singletones = new Dictionary<Type, Object>();
    public static T GetInstance<T>() where T : class {
        Type t = typeof(T);
        if (_Singletones.ContainsKey(t))
             return _Singletones[t] as T;
        else {
            // Create instance by calling private constructor and return it
            T result = Activator.CreateInstance(t, true) as T;
            _Singletones.Add(t, result);
            return result;
        }
    }
}

答案 2 :(得分:2)

它不是一个真正的答案,但也许很高兴知道。 Lazy

答案 3 :(得分:0)

为什么不简单地将该方法声明为非泛型并直接使用派生类型:

public class Derived {
  Derived instance;

  public static Derived GetInstance() {
    if (instance == null) {
      instance = new Derived();
    }
    return instance;
  }
}