2010-07-23 77 views
3

如果是这样,为什么你不能做到这一点:CLR是否支持静态接口?

public interface IParsable 
{ 
    static IParsable Parse(string s); 
    static bool TryParse(string s, out IParsable); 
} 

在C#中?

编辑:或者,也可以使用:

public interface IParseable<T> 
{ 
    static T Parse(string s); 
    static bool TryParse(string s, out T); 
} 

编辑#2: 我已经尝试使用IParsable得知我的方式的愚蠢,通过下面很多的建议。我做的例子如下。当然,没有办法解决TryParse的呼叫...

public IParsable ReadFromKeyboard() 
{ 
    IParsable ToReturn; 
    bool FirstTry = false; 
    bool Success; 
    do 
    { 
     if (!FirstTry) 
      DisplayError(); 
     AskForInput(); 

     Success = IParsable.TryParse(Console.ReadLine, out ToReturn); 
     FirstTry = false; 
    } while(!Success) 

    return ToReturn; 
} 
+2

方法看起来像是需要一个IParsable参数吗? – dtb 2010-07-23 17:29:35

回答

5

没有,CLR没有这样的事,作为静态接口。我猜测他们会对通用类型约束有用,但这只是使用使用我可以看到他们......否则,如何在您的示例中使用IParsable?你将如何通过能够解析它的类型?

请参阅this blog post了解我所设想的更多细节。

+0

它们对于静态工厂类也很有用。 – 2012-07-16 11:02:57

+0

@AaronMurgatroyd:但你将如何使用他们?试着弄清楚你使用的语法。 – 2012-07-16 11:11:43

+0

静态关键字可以在继承行(即冒号后面)和接口行(即定义的关键字接口之后)上使用,我还会对接口必须是全部静态或全部非静态-静态的。任何继承静态接口的类都必须实现所有这些静态方法。这是你的意思吗? – 2012-07-16 12:05:16

3

不,你不能强制类实现静态成员。

2

不,你不能为一个类来实现静态方法。有一个简单的原因:

一个接口允许你定义一个对象实例的行为。静态方法不属于对象的实例,它们属于该类型。因此,在界面中定义静态方法确实没有意义。

3

CLR不支持这一点。这是设计。

它有been suggested before - 如果你阅读那里的评论,你会发现在CLR中已经存在一些类型级别的契约(比如对泛型的限制)。

但是,界面实际上并不是正确的级别,因为它们(按设计)具有特定的含义:它们描述对象的行为合同。试图增加描述类型合约的能力将会改变接口的含义。

2

C#语言语法隐藏了它,但接口方法实现的一个正确关键是它是一个虚拟方法。它是隐藏的,当你编写实现方法时,你实际上并没有使用虚拟(或覆盖)关键字。

它必须是虚拟的,这就是如何在接口下实现接口。将对象转换为接口类型时,运行时会生成一个指向虚方法表部分的指针,该部分包含指向接口方法实现的指针。

接下来,假设虚拟方法与静态方法是极性相反的,那么接口声明永远不能包含静态方法。静态方法没有方法表项。