5

我正在尝试创建一个通用的单例基类,例如

public class SingletonBase<T> where T : class, new()
{
    private static object lockingObject = new object();
    private static T singleTonObject;
    protected SingletonBase()
    {

    }

    public static T Instance
    {
        get
        {
            return InstanceCreation();
        }
    }
    public static T InstanceCreation()
    {
        if(singleTonObject == null)
        {
             lock (lockingObject)
             {
                  if(singleTonObject == null)
                  {
                       singleTonObject = new T();
                  }
             }
        }
        return singleTonObject;
    }
}

但我必须在派生的构造函数中公开构造函数。

public class Test : SingletonBase<Test>
{
    public void A()
    {

    }
    private Test()
        : base()
    { }
}

编译错误:

“Test”必须是具有公共无参数构造函数的非抽象类型,以便在泛型类型或方法“Test”中将其用作参数“T”

我怎样才能做到这一点?

4

2 回答 2

7

问题是您的通用约束where T : class, new()。约束要求 T 上有一个公共的new()、无参数的构造函数。没有办法解决这个问题;您需要在Permission Controller.

于 2013-03-25T04:21:41.137 回答
3

我会避免这种递归通用模式。阅读这篇文,详细了解该模式以及使用它的原因。

据我所知,你不需要有任何SingletonBase<T>. 我看不到任何子类SingletonBase<T>能够添加到您的代码中的东西。我会简单地将其重写为

public static class Singleton<T> where T : class, new()
{
    ...
}

然后,您可以将其用作

var test = Singleton<Test>.Instance;

如果您希望能够Test用作单例,请将其创建为

public class Test 
{
    public static T Instance
    {
        get { return Singleton.Instance<Test>; }
    }
}
于 2013-03-25T04:11:41.007 回答