9

C# では、次のように Singleton クラスを実装できることがわかりました。

class Singleton
{

    private static Singleton _instance;
    public static Singleton Instance => _instance ??= new Singleton();

    protected Singleton() { }
}

type のインスタンスに対して機能しますSingleton。つまり、

var a = Singleton.Instance;
var b = Singleton.Instance;
Console.WriteLine(ReferenceEquals(a, b)); //Prints True.

しかし、Singleton の派生クラスも Singleton パターンに従うようにするにはどうすればよいでしょうか。つまり、次のようになります。

class A:Singleton
{ ... }
A a = A.Instance;

この場合、静的メンバーはクラスInstanceによってアクセスされ、目的ではないインスタンスを作成します。さらに、このソリューションには 2 つの主な問題があります。SingletonSingleton

  • 派生クラスは独自のコンストラクターを実装し、シングルトン パターンを失う可能性があります。
  • の別のインスタンスがあるSingleton場合、派生クラスはその派生の少ないインスタンスを参照します

私の質問は:派生クラスもシングルトンであることを保証する C# でシングルトン クラスを実装する別の方法はありますか?

4

2 に答える 2

5

私の質問は: 派生クラスもシングルトンであることを保証する C# でシングルトン クラスを実装する別の方法はありますか?

さて、コンストラクター内で次のようなチェックを行うことができます。

  • の実際のタイプthisは密封されています
  • の実際の型thisは の直接のサブクラスですSingleton
  • そのタイプの他のインスタンスは作成されていません (を保持することによりHashSet<Type>)

しかし、それはむしろ無意味に思えます。基本クラスは実際に何を達成することを意図していますか?

シングルトン パターンは適切に実装するのが簡単です(ちなみに、あなたの例ではそうではありません - スレッド セーフではありません) では、なぜ基本クラスがあるのでしょうか? 基本クラス自体はシングルトンではありません (サブクラスごとに 1 つのインスタンスが存在する可能性があります)。

「私はオブジェクトの実際の型のシングルトンです」というのはそもそも継承の適切な根拠ではないように思えますが、率直に言って、シングルトンパターンをできるだけ避けようとします。

基本クラスが本当に必要な場合は、すべてのサブクラスが自然に継承する共通の機能があるためです。これらのサブクラスがシングルトンであるかどうかと本質的に関係があるとは考えにくいです。

于 2013-05-31T20:33:44.227 に答える