7

我知道并理解 Java 中接口的价值。您对接口进行编码,然后您可以更改您的实现,而无需使用该接口更改任何代码。通常,术语“合同”与接口一起使用。我理解它的方式是接口定义了应用程序和实现之间的“合同”。

所以,当我创建一个实现时,我必须履行合同。我的问题是,我必须履行的合同中究竟有什么内容?

显然,您至少必须提供与接口具有相同签名的方法。否则代码将无法编译。这就是“合同”的全部内容吗?似乎应该有更多。

例如,我读过一些文章,讨论了测试接口与测试特定实现的价值,或者两者兼而有之。我认为对接口进行测试很有价值,这样您就可以知道哪些输入具有哪些预期输出。在我看来,这也是接口“合同”的一部分。接口的每个实现都应该从相同的输入产生相同的输出。显然没有办法在代码中强制执行这个契约,但是可以通过测试用例来强制执行。我在这里的想法错了吗?

最后,实现的副作用是什么?在这里,我主要谈论作为实现的一部分可能发生的任何持久性。假设我有一个在执行操作时将一些记录保存到数据库的实现。这会以某种方式成为接口“合同”的一部分吗?如果是这样,你怎么能执行这个合同?从接口级别,我不知道实现实际上在做什么。我只知道我给它输入,它给我一个输出,我可以测试它。发生的任何持久性是否也被视为“输出”?如果是这样,我只是不明白如何测试和执行它。我是坚持无知的支持者,所以我可以知道应该坚持一些东西,但我不知道如何它是持久的。所以,我只是不知道什么时候真正持续存在。如果你的界面有一些简单的 CRUD 操作可能很简单,但我想考虑更复杂的界面。

我希望我的问题是有道理的,并且有人可以提供一些好的反馈。我想一般性地讨论这个问题,但如果不清楚我在说什么,我可以提供一个具体的例子。

4

3 回答 3

4

我认为“合同”和“接口”的共同点很少。

界面就像一扇门。一扇门可以通过典型的人类,但不能通过大象、长颈鹿或汽车。

合同是指您可以确保只有女性、男性或软件开发人员可以通过门进来。

所以合约定义了行为,而接口定义了传递哪些信息

于 2012-03-30T18:11:29.783 回答
2

我认为您对“合同”一词的要求太大了。

埃菲尔”有着非常具体的“契约式设计”理念。就个人而言,我认为其他语言会从类似的东西中受益。

非正式地,您当然可以将 Java 的“接口”视为一种“契约”。您对 Java 接口的定义当然很好:

至少您必须提供与接口具有相同签名的方法。否则代码将无法编译。

问:这就是“合同”的全部含义吗?

答:可能不会。这完全取决于您如何定义“合同”;)

但是,恕我直言,Java 接口是一个比 C++“多重继承”的恐惧更清晰的特性。两者背后的主要动机之一是支持“ mixins ”:

同样,Java 接口也提供了一个干净的、相对简单的、类型保存的解决方案来支持“回调”。

最后建议:请考虑“接口”和“抽象类”的区别。这也可能让您更深入地了解 Java 接口,以及如何在自己的代码中有效地使用它们:

接口 vs 抽象类(通用 OO)

于 2012-03-30T18:09:02.560 回答
0

因此,合同是方法签名 + 与函数/类相关的任何文档。从中得出的结论是,接口与 java 关键字的含义不同interface。接口是允许您与另一个系统交互的任何东西。因此,对于您如何履行声明为这样的函数的合同的问题:

    /**  Throws IllegalArgumentException if s is null.    
Converts the input <b>s</b> into an {@link Integer}  */
    function go(String s);

您需要编写如下实现:

function go(String s)  
{  
    if(null == s) throw new IllegalArgumentException();  
    int i = Integer.parseInt(s);
}  

做作是的,但这应该解释如何执行合同并遵守它。

于 2012-03-30T18:12:57.033 回答