我正在尝试创建像
这样的通用单例基类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()
{ }
}
编译错误:
&#39;测试&#39;必须是具有公共无参数构造函数的非抽象类型才能将其用作参数&#39; T&#39;通用类型或方法&#39;测试&#39;
我怎样才能做到这一点?
答案 0 :(得分:6)
问题是您的通用约束where T : class, new()
。 new()
约束需要T上的公共无参数构造函数。没有办法解决这个问题;你需要在Permission Controller
中提供这样的构造函数。
答案 1 :(得分:3)
我会避免这种递归的通用模式。请阅读此this blog post以获取不使用它的模式和原因的详细说明。
据我所知,您不需要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>; }
}
}