0

私は(今)静的なクラスを持っています:

public static class Grob
{
    public static void Frob()
    {
        Foo.Bar();
    }
}

そして、それはうまくいきます。コード呼び出し:

Grob.Frob();

そして、すべてが世界で正しいです。今、私は私のクラスにインターフェースを実装させたいです:

public static class Grob : IOldNewGrob
{
    public static void Frob()
    {
       Foo.Bar();
    }
}

残念ながら、それはうまくいきません。理由があります。

だから私はクラスをシングルトンに変更してみます:

public sealed class Grob
{
   private static volatile Singleton instance;
   private static object syncRoot = new Object();

   private Grob() {}

   public static Singleton Instance
   {
      get 
      { 
         if (instance == null) 
         {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Singleton();
            }
         }
         return instance;
     }
   }       
}

これは、機能しないことを除いて、十分に機能します-コードはコンパイルされなくなります:

Grob.Frob();

他の言語では問題ありません。私はグローバルGrob関数を作成します(Grobそれが既存のコードに必要な名前であるために呼び出されます):

function Grob(): GrobSingleton;
{
   return Grob.Instance;
}

//and rename Grob class to something else
public sealed class GrobSinglton
{
   ...
}

ただし、C#にはグローバル関数がありません。

最終的には:

  • グローバル関数は必要ありません
  • インターフェイスを実装するために静的クラスは必要ありません
  • シングルトンは必要ありません

私はそれをすべて機能させたいだけです。

4

1 に答える 1

10

静的メソッド持つシングルトンを作成してみませんか?Frob

public sealed class Grob : IOldNewGrob
{
    private static readonly Grob instance = new Grob();

    public static Grob Instance { get { return instance; } }

    // Prevent external instantiation
    private Grob() {}

    public static void Frob()
    {
        Foo.Bar();
    }

    // Implement IOldNewGrob here
}

おそらく、.NETでのシングルトンパターンの実装に関する私の記事も読む必要があります。壊れやすいダブルチェックのロックパターンを実装する必要は実際にはありません。

Grob.Frob()これは、作業を行うこととGrob、インターフェースを実装することの両方の要件を満たします。ただし、これらが唯一の要件であるかどうかは明らかではありません。シングルトンまたはインターフェイスがどこから来るのか、なぜそうしようとしているのかは実際には説明されていません。

編集:アイデアがFrobのメンバーだった場合は、次のIOldNewGrobような明示的なインターフェイス実装を使用できます:

public sealed class Grob : IOldNewGrob
{
    private static readonly Grob instance = new Grob();

    public static Grob Instance { get { return instance; } }

    // Prevent external instantiation
    private Grob() {}

    public static void Frob()
    {
        // Implementation
    }

    // Explicit interface implementation to prevent name collisions
    void IOldNewGrob.Frob()
    {
        // Call the static implementation
        Frob();
    }
}
于 2012-06-11T17:41:33.200 に答える