我正在阅读这本书The Java Programming Language。在解释覆盖方法的章节中,它说:
使覆盖方法(在子类中)比在超类中更容易访问会违反超类的合同......
整个文本是可以理解的。我唯一的问题是超类合同是什么? 合同对 Java 类意味着什么?
答案 0 :(得分:32)
Java类中的合同类似于现实世界中的合同 - 非技术术语:
这是一个协议,该类将暴露某些方法,某些属性和某些行为。
更具技术性,来自here :(由我添加的粗体)
如果您使用的所有Java类(包括您的类)都不是很好 自己,兑现了他们的承诺?事实上,如果你不是很好 实际上确切知道给定的班级承诺什么?如果您同意,请阅读 在[...]
按合同设计
合同设计(DBC)软件开发技术确保 通过保证系统的每个组件来保证高质量的软件 不负众望。作为使用DBC的开发人员,您可以指定 组件合同作为组件接口的一部分。 合同 指定该组件对客户端的期望以及客户端的期望 期待它。
答案 1 :(得分:5)
类型(类,接口,枚举)的合同是此类型承诺遵守的合同。它声明:
addData(float)
类的方法MathAverage
来计算其输入的平均值,可以说明每次调用add(float)
时都会返回,您应该预期调用MathAverage.getAverage()
来返回正确的当前输入平均值。合同在javadoc类型中以自由格式指定。有一些工具/实践来强制执行合同,但它们是有限的,正是因为合同可能是任意的,或者甚至是自相矛盾的,如果程序员的错误。
由于子类型(子类化)可以以任意方式扩展/修改超类型方法的行为,因此它也可能违反超类型契约的某些部分。这样做的示例是扩展HashMap
,它接受null
值和键,其中一些实现禁止调用它的方法中的null
值。
关于类型契约的其他重要方面是子类型可以具有更强的契约(涵盖类型契约中约束的子集),但不能有弱契约(覆盖超集)类型约束中的约束条件)。
例如,如果类型的方法'doX(n)'承诺采用O(n)
(线性)时间,则子类型中的'doX(n)'可以花费O(1)
(常数)时间,但不能采用O(n^2)
时间。
答案 2 :(得分:3)
一个类的“契约”是它的公共接口,或者至少是接口,如果呈现给自己以外的类。
这意味着它包含其他类可以使用的任何元素(方法,字段,构造函数等)。
答案 3 :(得分:2)
这意味着覆盖父类或接口上的方法的方法必须以契约定义的方式运行。
否则结果未定义。
答案 4 :(得分:0)
在使用java或任何编程语言进行编程时,您应该遵循许多原则。原则取决于您使用的编程语言。您可以在Design by contract wikipedia page
中了解有关合同的更多信息答案 5 :(得分:0)
简单来说,这意味着如果你使覆盖代码不易访问,你就会破坏超类的条件
答案 6 :(得分:0)
这是一种来自“现实世界”合同理念的表达。
基本上,如果你违反了与班级的合同,那么就不需要按照你期望的方式行事。从另一个方向来看,课堂上的承诺是,如果你遵循它所规定的规则,它将按其API所说的方式行事。
Java中契约的一个常见示例是覆盖equals()
时覆盖hashCode()
。根据契约,两个被认为相等的对象必须具有相同的哈希码。编写语法正确且不遵守此规范的代码是可能的,但它可能无法正常工作,这是程序员违反合同的错误。
答案 7 :(得分:0)
Java或任何其他OO语言的类或接口的契约通常是指该类接口的强制公开方法(或函数)和属性(或字段或属性)以及适用于这些公共方法和财产的任何评论或文件。
对于类和子类之间的关系,任何受保护的方法或属性都会被视为“公开暴露”,因为它们会暴露给子类。