2012-06-11 66 views
0

類我有一個類(現在)是靜態的:靜態/單接口實現在C#

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

而且行之有效。代碼調用:

Grob.Frob(); 

和所有的東西都是對的。現在,我想我的類來實現接口:

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

不幸的是不起作用的,因爲reasons

所以我會嘗試改變上課到singleton

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

中底:

  • 我不需要全局函數
  • 我不需要靜態類能夠實現一個接口
  • 我不t 需要一個單身人士

我只是想要一切工作。

+1

爲什麼你就不能調用'Grob.Instance.Frob()'?這就是單身人士的工作方式。 – cdhowie

+0

@cdhowie我可以打電話給'Grob。Instance.Frob()';但現有的代碼沒有。 –

回答

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 
} 

你或許應該也看過我的article on implementing the singleton pattern in .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(); 
    } 
} 
+0

委託實施我的方法來....自己!尼斯。 **編輯:**爲什麼不這樣做?因爲我沒有想到它。單身人士不會進入任何地方;這不是25分鐘前的一次。當人們採用'IOldNewGrob'而不是'Grob'時,界面就進入了。 –

+0

哦,等一下。我不能'公共靜態void Frob()'和'公共void Frob()'。 *列梅檢查喬恩的答案*哦,你創建了一個新的'Foo'類。也許使用接口被高估。 –

+0

@IanBoyd有各種[庫](http://code.google.com/p/impromptu-interface/)將採用靜態類和接口,並在運行時生成代理類,將接口方法實現委託給相應的靜態方法。無論額外依賴和一次性運行時代碼生成的開銷是否值得,都需要進行一次調用。它可能會導致更簡單的代碼。 – cdhowie