我有几个单例类,所以我尝试使用方法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
的实例答案 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;
}
}