接口作为对象的合同是否是类?
从代码到执行代码,区分相同的事情有什么需要?我有点想法将一个类命名为一个类,并将实例化的执行类命名为一个对象,但总的来说,这是这些半冗余项的唯一原因吗?
并不是的.这里有四个术语,所以我将逐一介绍它们:
接口是一个抽象类(在Java这样的语言中,没有多重继承,有时还有其他限制,例如单独的数据类型),它们被用作访问许多类似行为对象的公共基础. .从概念上讲,不需要抽象,但通常,接口至少会有一个抽象方法.接口是程序与许多类似类进行通信的方法,每个类具有不同的语义但具有相同的通用性.
契约是您在类或接口的用户和实现者之间做出的隐式协议.例如,前置条件和后置条件(不变量通常是类实现中的契约 - 通常,内部成员之间的关系之类的事情不需要暴露).返回值或参数的规范也可以是合同的一部分.它基本上代表了如何使用函数/类/接口,并且通常不能用任何语言完全表示(某些语言,如Eiffel,允许你输入明确的合同,但即使这些也不能总是充分满足要求).当您实现接口或从类派生时,您始终必须满足接口要求,或者,当覆盖非抽象类时,
一堂课不需要经过多次考试,因为你之前已经清楚地使用了它们.类是数据类型,在某些语言中是接口的超集(没有正式定义,如在C++中),在其他语言中是独立的(例如在Java中).
对象是类类型的实例(通常是任何非类类型的实例).对象的确切定义非常特定于一种语言,但一般定义是多个引用/指向同一事物的实际内容 - 例如,在某些语言中,如Java,==比较两个变量是否是相同的对象,不一定是否在语义上相同.对象独立于类或接口 - 它们代表单个实例.另一种思考方式是类或界面是模具,对象是从模具中出来的物理对象(一个相当糟糕的类比,但它是我现在能想到的最好的).
不,不是真的.类是您定义的模板.实例化该类的每个对象都遵循模板.它们并不是多余的术语,因为这两者并不相同.您可以将类视为用户定义的数据类型.类和对象彼此不同的方式与原始数据类型int
与文字值3不同的方式完全相同.
接口定义了一组所有实现类必须支持的方法.接口本身是您为实现类定义的合约.它只是说任何实现接口的类都必须具有该接口的公共方法集.