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