1

我有一个界面

interface IFooWidget
{
     IWidget Get(string widgetName);
}

我的问题是 - 我如何告诉实现者错误情况的返回语义?我的意思是如果他们找不到请求的小部件,他们应该抛出或返回一个空值。这似乎是接口定义的重要部分,但我无法表达。

似乎记录它是唯一的方法 - 如果我能以某种方式将它放在编译器语言而不是人类语言中会更好。

只是想知道是否有人有任何解决方案或想法......

共识答案:

接口定义语法而不是语义。我让自己被我的方法定义的英语所吸引。想象一下,如果它是

IWidget Fnargle(string wobbler);

这当然是编译器的样子。最初的问题中暗示了调用语义,因为我选择了一个据称有用的方法名称和参数。但实际上我需要记录该方法语义的所有方面——这是不可避免的

4

4 回答 4

1

没有内置方法可以指定方法可能引发哪些异常 - C# 没有类似于 Java 的已检查异常。如果要确保调用者能够处理任何错误,可以为异常处理程序添加参数:

interface IFooWidget
{
     IWidget Get(string widgetName, Action<ExceptionType> handler);
}
于 2013-01-04T22:25:33.930 回答
0

没有办法在 C# 中正式记录或强制执行这一点。

实际上,接口并不能表达很多东西。它们不表达传入或传出数据的前置条件和后置条件。它们确实表达了数据格式(参数的类型和数量),但这只是任何给定方法合同的一小部分。

这里有一些工具试图提供帮助。我想到了代码合同。他们只是创造了一种不同的方式来表达这些条件。他们不会静态地强制执行它们。

于 2013-01-04T22:16:03.900 回答
0

好吧,我不认为你可以用 C# 来表达这一点(就像在大多数其他现代语言中一样)。

恕我直言,我认为接口正是为了不表达任何实现细节;如果您希望您的方法(由接口指定的方法)仅在特定条件为真时返回某些内容,我倾向于说这是一个实现细节。

接口中定义的方法是所有可能实现中最不常见的部分,即方法签名不是关于方法应该(或必须)如何实现的任何声明。

于 2013-01-04T22:22:45.503 回答
0

我不相信有一个选项可以在界面中指定它。一种选择是添加您建议的评论。类似下面的注释将在 IntelliSense 中为实施者显示。

/// <exception cref="Exception"></exception>

如果您使用的是 .Net 4.5,则可以使用 System.Diagnostics.Contracts 命名空间来指定后置条件,以使用Contract.Ensures确保结果不为空。不幸的是,向接口添加合同有点痛苦。ContractClassAttribute上的 Microsoft 文档提供了有关如何执行此操作的详细信息。

于 2013-01-04T22:30:18.303 回答