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()です。new()制約には、T上にパブリックなパラメーターなしのコンストラクターが必要です。これを回避する方法はありません。でそのようなコンストラクターを提供する必要があります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 に答える