【问题标题】:Interface Contract, Class Object?接口契约,类对象?
【发布时间】:2010-09-18 04:17:55
【问题描述】:

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

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

【问题讨论】:

  • 我现在看到了不同之处,谢谢你的答案。我已经使用它们多年了,尽管从我所看到的情况来看很好而且准确,但我从未真正停下来真正思考过这些定义。

标签: class interface object contract


【解决方案1】:

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

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

一个实现多个接口的类:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    至少这是 .NET 中的 POV

    【讨论】:

      【解决方案3】:

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

      界面

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

      合同

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

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

      对象

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

      【讨论】:

      • 不确定其他语言,但在C#中interfaceabstract class相似,但概念不同;它们不一样,不能总是互换使用。
      • 我仍然不会省略“隐含” - 这不一定描述我所理解的合同的性质。通常,类型系统允许程序员表达对实现的约束。因此,类型定义(例如 Java 中的接口)可以很好地视为由实现它的类型实现的显式契约。
      • 参见例如这个 cseducators 帖子:cseducators.stackexchange.com/questions/544/…
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

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

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多