我有一个这样的数据库包装代码(伪代码):
class MyDBWrapper<objecttype> : Singleton
{
private DBDriver _Driver
Driver => Instance._Driver;
... tons of static functionality here referencing the driver
}
然后我可以从它创建自定义数据库:
class ObjectA_DB : MyDBWrapper<ObjectA_Type>
{
... all my calls using the static functionalities of the base class
}
这很有效......
现在,出现了另一种情况:
我有一个通用对象:BaseObject 和一堆派生对象:ObjectA,ObjectB等
并且它们都需要相同的数据库代码,所以我这样做了:
class MyGenericDB<T> : MyDBWrapper<T> where T : BaseObject
{
.. common functionality
}
然后实例化类型特定的类,如下所示:
class MyTypeA_DB : MyGenericDB<ObjectA_Type>
class MyTypeB_DB : MyGenericDB<ObjectB_Type>
并且这可以正确编译,但是当我尝试访问实例时,单例代码会导致问题 因为它似乎正在递归。 Visual Studio无法对发生的事情给出正确的错误,但它会挂起然后崩溃,所以我猜测堆栈溢出。
单身代码在这里:
public abstract class Singleton<T> where T : class
{
private static readonly Lazy<T> _Instance = new Lazy<T>(CreateInstanceOfT, LazyThreadSafetyMode.PublicationOnly);
protected static T Instance => _Instance.Value;
private static T CreateInstanceOfT()
{
return Activator.CreateInstance(typeof(T), true) as T;
}
}
我是否错过任何明显的事情?
答案 0 :(得分:0)
并不习惯这个版本的泛型,因为我的主要工作是统一的,并且他们每十年更新一次核心,但我很确定你需要公开的实例才能被允许阅读它。
当我写这篇文章时,我传统上创建了一个传递类型的私有静态实例,然后使用一个公共静态访问函数来创建该类型,如果它还不存在的话。
我可以在这里找到我自己的主引擎的完整示例: http://wiki.unity3d.com/index.php/Singleton。