2012-06-11 65 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