如何创建一个通用的单例基类

本文关键字:单例 基类 一个 何创建 创建 | 更新日期: 2023-09-27 18:05:43

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

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

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

编译错误:

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

我怎样才能做到这一点?

如何创建一个通用的单例基类

问题是您的通用约束where T : class, new()new()约束要求t上有一个公共的、无参数的构造函数。你需要在Permission Controller中提供这样一个构造函数

我会避免这种递归的泛型模式。请阅读这篇博客文章,了解该模式的详细解释以及不使用的原因。

据我所知,您不需要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>; }
    }
}