22

接口的契约是对象与类的契约吗?

从代码到执行代码,有什么需要区分这样的相同事物?我有点理解将类命名为类并将实例化的执行类命名为对象的想法,但总的来说,这是这些半冗余术语的唯一原因吗?

4

6 回答 6

37

并不真地。这里有四个术语,所以我将分别介绍它们:

界面

接口是一个抽象类(在没有多重继承的 Java 等语言中,有时还有其他限制,例如单独的数据类型),旨在用作访问许多行为相似的对象的公共基础. 从概念上讲,对抽象没有要求,但通常一个接口至少有一个抽象方法。接口是您的程序与许多类似的类进行通信的一种方法,每个类具有不同的语义但具有相同的通用目的。

合同

契约是您在用户和类或接口的实现者之间达成的隐含协议。例如,前置条件和后置条件(不变量通常是类实现中的约定——通常,不需要公开内部成员之间的关系等内容)。返回值或参数的规范也可以是合同的一部分。它基本上代表了如何使用函数/类/接口,并且通常不能用任何语言完全表示(某些语言,如 Eiffel,允许您将明确的合同放入其中,但即使这些也不能总是完全充实要求)。当你实现一个接口或从一个类派生时,你总是必须满足接口要求,或者,当覆盖一个非抽象类时,

班级

一个类不需要太多的复习,因为你显然以前用过它们。类是数据类型,在某些语言中是接口的超集(没有正式定义,如在 C++ 中),而在其他语言中是独立的(如在 Java 中)。

目的

对象是类类型(或任何非类类型,通常)的实例。对象的确切定义对于一种语言来说是非常特定的,但一般定义是由多个引用/指向同一事物的指针所引用的实际事物——例如,在 Java 等某些语言中,== 比较两个变量是否是相同的对象,不一定它们在语义上是否相同。对象独立于类或接口——它们代表单个实例。另一种思考方式是类或接口是模具,而对象是从模具中出来的物理对象(一个相当糟糕的类比,但这是我现在能想到的最好的类比)。

于 2008-10-20T19:08:22.670 回答
8

不,不是。类是您定义的模板。实例化该类的每个对象都遵循模板。它们并不是真正多余的术语,因为这两件事并不相同。您可以将类视为用户定义的数据类型。类和对象彼此不同,就像原始数据类型int与字面值 3 不同一样。

接口定义了所有实现类必须支持的一组方法。接口本身就是您为实现类定义的契约。它只是说任何实现该接口的类都必须具有该接口的一组公共方法。

于 2008-10-20T18:58:01.503 回答
2

好吧,我猜......如果一个接口指定了一个契约,而不是一个类指定了一个(或多个)特定对象的实例。

不过,术语不如应用重要。

于 2008-10-20T18:57:05.593 回答
1

实际上,接口是一种契约,当一个对象是一个类的一个实例时——它们是不同的东西,没有太多的共同点。

接口只是为对象提供了一个外观,或者为调用者保证对象可以执行某些操作,即使不知道它的实现。

例如,您可以让两个类实现相同的接口/契约,但做完全不同的事情(即使做这些事情的意义可能相同)。

以 IDisposable 接口为例:每个对象都可以释放它使用的资源,但它可以通过多种不同的方式来释放它,它可以选择不释放任何东西。这是对象的选择。

至少这将是 .NET 中的 POV

于 2008-10-20T18:57:47.933 回答
1

为了完成前面的答案,关于接口的一句话:

如果类不仅仅是一个对象的模板(因为它的全局特性独立于任何实例),接口也可以被描述为一个观点

一个实现多个接口的类:

  • 完成它需要遵守的合同
  • 允许用户从实现的接口所代表的角度查看该类的任何实例。

“观点”意味着您可以通过仅关注该接口定义的合同来使用对象。

正是在这方面,接口是“抽象类”,就像在“抽象”中一样(继承了类的某些特征,但忽略了其他一些特征)。在 Java 世界中,接口实际上留下了很多东西,因为它只能用于定义合同,例如,不能用于静态方法或函数。

于 2008-10-20T19:29:46.307 回答
0

“类”和“对象”代表两个不同的东西;它们是相关的,但它们所代表的东西是不同的,非常强烈。

描述这一点的最好方法是查看静态。一个类可以有静态成员,它们完全独立于该类的任何实例。该类的对象可能使用也可能不使用这些静态成员;但是该类的对象的实例与该类的任何静态使用完全分开(或者至少应该是)。

或者想想单例模式。将类对象的实例存储在静态类访问器中是一种常见的做法,并显示了不同之处。您引用类静态访问器来获取单例类的对象实例;如果类静态成员没有要引用的对象实例,则该类创建该对象实例

换一种方式; 对象类的实例;但是一个类可以不仅仅是一个从中实例化对象的模板。类的静态成员在内存中具有完全独立于这些类的对象实例的表示。

于 2008-10-20T18:57:19.510 回答