Interface Contract, Class Object?
合同到接口作为对象是到类吗?
需要什么来区分相同的东西,像这样,从代码到执行代码?我有点理解命名一个类A类和实例化的执行类A对象背后的想法,但总的来说,这是这些半冗余项的唯一原因吗?
不是真的。这里有四个术语,我将逐一介绍:
界面接口是抽象类(在Java之类的语言中,没有多重继承,有时还有其他限制,例如单独的数据类型),它被用作一个共同的基础来访问许多类似行为的对象。从概念上讲,对抽象性没有要求,但是通常一个接口至少有一个抽象方法。接口是程序与许多类似类进行通信的方法,每个类具有不同的语义,但通用性相同。
合同契约是您在类或接口的用户和实现者之间所做的隐式协议。例如,前提条件和后置条件(不变量通常是类实现中的一个契约——一般来说,内部成员之间的关系不需要公开)。返回值或参数的规范也可以是合同的一部分。它基本上代表了如何使用函数/类/接口,并且通常在任何语言中都不能完全表示(有些语言,如埃菲尔,允许您输入明确的契约,但即使这些语言也不能完全充实需求)。当你实现一个接口或从一个类派生时,你总是必须满足接口要求,或者,当覆盖一个非抽象类时,你必须表现得足够相似,以至于外部的观察者不会注意到差异(这是liskov替换原则;派生的对象应该能够用没有差异的方式替换基从外部的角度看行为上的差异)。
等级一门课不需要做很多复习,因为你以前很明显用过。类是数据类型,并且在一些语言中是接口的超集(它没有正式定义,如C++),而在其他语言中是独立的(例如在Java中)。
对象对象是类类型(通常是任何非类类型)的实例。对象的确切定义对于语言来说是非常具体的,但一般的定义是由多个引用/指针指向同一事物的实际事物——例如,在某些语言如Java中,= =比较两个变量是否是同一个对象,而不一定是语义上是否相同。对象独立于类或接口-它们表示单个实例。另一种思考方法是类或接口是模型,对象是从模型中出来的物理对象(一个相当糟糕的类比,但这是我现在能想到的最好的)。
不,不是真的。类是您定义的模板。在模板之后实例化该类的每个对象。它们不是多余的术语,因为这两个词是不相同的。可以将类视为用户定义的数据类型。类和对象之间的区别与原始数据类型
接口定义了所有实现类必须支持的一组方法。接口本身就是您为实现类定义的契约。它只是说,任何实现接口的类都必须具有该接口的一组公共方法。
要完成前面的答案,请输入一个关于接口的单词:
如果类不仅仅是一个对象的模板(因为它的全局特性独立于任何实例),那么也可以将接口描述为一个视角
实现多个接口的类:
- 完成它需要遵守的合同
- 允许用户从实现的接口表示的实例的角度查看该类的任何实例。
"视角"是指您可以通过只关注该接口定义的契约来使用对象。
在这一方面,接口是一个"抽象类",就像在"抽象"中一样(这是一种在一个类的某些特征之后,却忽略了其他一些特征的东西)。在Java世界中,接口实际上离开了很多,因为它只能应用于定义契约,而不是静态方法或函数。
实际上,当一个对象是一个类的实例时,接口就是一个契约——它们是不同的东西,没有太多共同点。
接口只是为对象提供一个外观,或者向调用者提供一个保证,即对象可以执行某些操作,即使不知道它的实现。
例如,您可以有两个实现相同接口/契约的类,但它们可以做完全不同的事情(即使这样做的意义可能相同)。
以IDisposable接口为例:每个对象都可以释放它使用的资源,但是它可以用许多不同的方式来释放,它可以选择不释放任何东西。这是物体的选择。
至少这是.NET中的POV
我想…如果一个接口指定了一个约定,而不是一个类指定了一个(或多个)特定对象的实例。
不过,术语比应用程序更不重要。
"类"和"对象"代表两种不同的事物;它们是相关的,但它们所代表的是不同的,非常强烈的。
描述这一点的最好方法是看静态。类可以具有静态成员,这些静态成员与该类的任何实例完全分离。该类的对象可以使用这些静态成员,也可以不使用这些静态成员;但是该类对象的实例完全独立于该类的任何静态使用(或者至少应该是)。
或者想想单子模式。在静态类访问器中存储类对象的实例是一种常见的实践,并显示了不同之处。引用类静态访问器以获取单例类的对象实例;如果类静态成员没有要引用的对象实例,则类将创建该对象的实例。
换句话说,对象是一个类的实例;但是类可以不仅仅是一个模板,对象可以从中实例化。类的静态成员在内存中具有完全独立于这些类的对象实例的表示。