gpt4 book ai didi

c# - 返回后代的单例实例

转载 作者:行者123 更新时间:2023-11-30 14:01:06 25 4
gpt4 key购买 nike

我有几个单例类,所以我尝试使用方法 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() 方法,那么派生类不需要覆盖它,但它会从调用它的地方返回类的实例... Derived.GetInstance()将返回 Derived 的实例

最佳答案

你可以使用 Dictionary<Type, Object>为你的单例。下面的方法要求每个类型都实现私有(private)的构造函数。当然,如果 singletones 字典中已经存在该类的实例,您也可以检查每个派生类。这甚至可以避免有人使用 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;
}
}
}

关于c# - 返回后代的单例实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8971644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com