接口契约,类对象?

时间:2008-10-20 18:39:26

标签: class interface object contract

作为对象的接口的合约是否是类?

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

6 个答案:

答案 0 :(得分:33)

不是真的。这里有四个术语,所以我将逐一介绍它们:

接口

接口是一个抽象类(在Java这样的语言中,没有多重继承,有时还有其他限制,例如单独的数据类型),它们被用作访问许多类似的公共基础。 - 有害的物体。从概念上讲,不需要抽象,但通常,接口至少会有一个抽象方法。接口是程序与许多类似类进行通信的方法,每个类具有不同的语义但具有相同的通用目的。

合同

合同是您在类或接口的用户和实现者之间做出的隐式协议。例如,前置条件和后置条件(不变量通常是类实现中的契约 - 通常,内部成员之间的关系之类的事情不需要暴露)。返回值或参数的规范也可以是合同的一部分。它基本上代表了如何使用函数/类/接口,并且通常不能用任何语言完全表示(某些语言,如Eiffel,允许你输入明确的合同,但即使这些也不能总是充分满足要求)。当您实现接口或从类派生时,您总是必须满足接口要求,或者,当覆盖非抽象类时,行为足够相似,外部查看器不会注意到差异(这是Liskov替换原则;派生对象应该能够替换基础,而外部视角的行为没有差异。)

一个课程不需要经常学习,因为你之前已经清楚地使用过它们了。类是数据类型,在某些语言中是接口的超集(没有正式定义,如在C ++中),而在其他语言中是独立的(例如在Java中)。

对象

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:1)

嗯,我猜...如果接口指定合同而不是类指定特定对象的(或多个)实例。

虽然术语不如应用程序重要。

答案 3 :(得分:1)

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

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

例如,你可以有两个类实现相同的接口/契约,但完全不同的东西(尽管这样做的含义可能相同)。

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

至少这将是.NET中的POV

答案 4 :(得分:1)

要完成以前的答案,请谈谈接口:

如果类不仅仅是对象的模板(因为它的全局特性与任何实例无关),那么界面也可以被描述为 视角

实现多个接口的类:

  • 完成需要尊重的合同
  • 允许用户从实现的界面所代表的视角中查看该类的任何实例。

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

正是在这个方面,接口是一个“抽象类”,就像在“抽象”中一样(某种类似于某个类的特征,但却留下了其他一些特性)。在java世界中,接口实际上留下了很多东西,因为它只能用于定义契约,而不能用于静态方法或函数。

答案 5 :(得分:0)

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

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

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

换句话说;对象类的实例;但是一个类可以更多,而不仅仅是实例化对象的模板。类的静态成员在内存中具有完全独立于这些类的对象实例的表示。