簡體   English   中英

C#中的靜態/單個接口實現類

[英]Static/singleton interface implementing class in C#

我有一個( 現在 )是靜態的類:

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#沒有全局功能。

到底:

  • 不需要全局功能
  • 不需要靜態類就能實現接口
  • 不需要單身人士

我只希望一切正常。

為什么不創建一個單身有一個靜態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實現接口的兩個要求。 尚不清楚這些是否是您唯一的要求-您尚未真正解釋為什么要這樣做-單例或接口進入的位置。

編輯:如果想法是FrobFrob的成員, 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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM