CLR是否支持静态接口?

3
如果可以的话,为什么不能这样做呢:
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
6个回答

5
CLR没有静态接口这种东西。我猜想它们可能对于泛型类型约束有用,但那是我能看到的唯一用途...否则你怎么使用在你的示例中的IParsable?你如何传递能够解析它的类型?请参阅此博客文章以获取更多详细信息。

它们也将对静态工厂类非常有用。 - Aaron Murgatroyd
@AaronMurgatroyd:但是你会如何“使用”它们呢?尝试推导出你将会使用的语法。 - Jon Skeet
静态关键字可以用于继承行(即冒号后面)和接口行(即定义中的interface关键字后面),我还会限制接口必须全部是静态或全部是非静态。任何继承静态接口的类都必须实现所有这些静态方法。这就是你的意思吗? - Aaron Murgatroyd
说实话,我相信像泛型这样的东西肯定还有其他语义和逻辑问题需要解决,这让人感到困惑,但我相信微软的一些天才可以解决它!:D - Aaron Murgatroyd
我不在这里设计它,那是微软的问题,但如果能像Delphi 7一样就好了。 - Aaron Murgatroyd
显示剩余4条评论

3

不,你无法强制一个类实现静态成员。


3

CLR不支持这个功能。这是有意设计的。

之前已经有人提出过此建议-如果您阅读评论,就会发现CLR中已经存在一些类型级别的契约(例如对泛型的限制)。

然而,接口并不是正确的层次结构,因为它们(通过设计)具有特定的含义:它们描述了对象的行为协议。尝试添加描述类型协议的能力将改变接口的含义。


2

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

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


2

C#语言的语法将其隐藏了,但接口方法实现的一个关键点是它是虚方法。虽然你在编写实现方法时没有使用虚拟关键字(或覆盖关键字),但它必须是虚拟的,因为这就是接口在底层实现的方式。

当你将一个对象强制转换为接口类型时,运行时会生成一个指向虚方法表中包含接口方法实现指针的部分的指针。

由于虚方法和静态方法是完全相反的,因此接口声明永远不可能包含静态方法。静态方法没有方法表条目。


0

不,CLR 不能支持静态接口。这将是一个方便的功能,但您需要使用常规接口或反射来模拟它。

.NET(好吧,C#)没有的其他类似功能:Haskell 类型类, F# 泛型类型成员约束


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接