在接口定义中表示返回语义

本文关键字:返回 语义 表示 接口 定义 | 更新日期: 2023-09-27 17:50:48

我有一个接口

interface IFooWidget
{
     IWidget Get(string widgetName);
}

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

似乎记录它是唯一的方法——如果我能以某种方式把它变成编译器语言而不是人类语言,那就更好了。

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

一致回答:

接口定义语法而不是语义。我允许自己被我的方法定义的英国化所诱惑。想象一下,如果它是

IWidget Fnargle(string wobbler);

在编译器看来当然是这样的。在最初的问题中已经暗示了调用语义,因为我选择了一个方法名和参数,它们被认为是有用的。但是我确实需要记录方法语义的所有方面——不可避免的

在接口定义中表示返回语义

没有内置的方法来指定可能从方法抛出的异常- c#没有类似于java的检查异常。如果希望确保调用者处理任何错误,可以为异常处理程序添加参数:

interface IFooWidget
{
     IWidget Get(string widgetName, Action<ExceptionType> handler);
}

没有办法在c#中正式记录或强制执行。

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

这里有一些工具试图提供帮助。我想到了代码契约。它们只是创造了一种不同的方式来表达这些条件。

嗯,我不认为你可以在c#中表达这个(就像在大多数其他现代语言中一样)。

我认为接口就是用来不表达任何实现细节的;如果你想让你的方法(接口指定的那个)只有在特定条件为真时才返回一些东西,我倾向于说这是一个实现细节。

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

我不相信在接口中有一个指定这个的选项。一种选择是像您建议的那样添加注释。像下面这样的注释将显示在实现者的IntelliSense中。

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

如果你使用的是。net 4.5,你可以使用System.Diagnostics.Contracts命名空间来指定post条件,以确保使用contract . ensure结果不为空。不幸的是,向接口添加契约有点麻烦。微软文档中的ContractClassAttribute给出了如何做到这一点的详细信息。