什么是“合同”类是什么意思

我正在读“Java编程语言 ”一书。 在解释最重要方法的章节中,它说:

使覆盖方法(在子类中)比在超类中更难访问会违反超类的合同……

整个案文是可以理解的。 我唯一的问题是什么是超类的合同合同Java类意味着什么?

Java类中的合同类似于现实世界中的合同 – 非技术术语:

这是一个协议,该类将暴露某些方法,某些属性和某些行为。

更多技术,从这里 :(大胆加我)

如果您使用的所有Java类(包括您自己的类)都兑现了他们的承诺,那不是很好吗? 事实上,如果你真的确切地知道某个class级承诺什么,那不是很好吗? 如果您同意,请继续阅读[…]

按合同设计

合同设计(DBC)软件开发技术通过保证系统的每个组件都达到预期,确保了高质量的软件。 作为使用DBC的开发人员,您可以将组件合同指定为组件接口的一部分。 合同规定了该组件对客户的期望以及客户对其的期望。

类型(类,接口,枚举) 的合同是这种类型承诺遵守的合同 。 它指出:

  • 这种类型的构造函数和/或方法的可接受参数是什么;
  • 你应该和/或不应该期望这种类型做什么。 例如,它可能声明您希望此类是线程安全的或不是线程安全的;
  • 这种类型支持的不变量是什么。 例如,类型MathAverage类的方法MathAverage addData(float)计算它的输入平均值可能表示每次调用add(float)返回时,您应该调用MathAverage.getAverage()来返回当前输入的正确平均值。
  • 一般来说,你的类型可以指定它的子类必须遵循的任何约束。 例如,它可能会说“没有这种类型的方法必须花费超过1秒才能执行”。

合同在javadoc类型中以自由格式指定。 有一些工具/实践来强制执行合同,但它们是有限的,正是因为合同可能是任意的,或者甚至是自相矛盾的,如果程序员的错误。

由于子类型(子类化)可以以任意方式扩展/修改超类型方法的行为,因此它也可能违反超类型契约的某些部分。 这样的例子就是扩展HashMap ,它接受null值和键,以及一些在调用它的方法时禁止null值的实现。

关于类型契约的另一个重要方面是子类型可以具有更强的契约(涵盖类型契约中约束的子集),但不能具有较弱的契约(涵盖类型契约中约束的超集)。 例如,如果类型的方法’doX(n)’承诺采用O(n) (线性)时间,则子类型中的’doX(n)’可以采用O(1) (常数)时间,但不能采用O(n^2)时间。

类的“契约”是它的公共接口,或者至少是接口,如果呈现给自己以外的类。

这意味着它包含其他类可以使用的任何元素(方法,字段,构造函数等)。

这意味着覆盖父类或接口上的方法的方法必须以合同定义的方式运行。

否则结果是不确定的。

在使用java或任何编程语言进行编程时,您应该遵循许多原则。 原则取决于您使用的编程语言。 您可以通过合约维基百科页面了解有关合同的更多信息

简单来说,这意味着如果你使覆盖代码不易访问,你将破坏超类的条件

这是来自“现实世界”中合同理念的表达。

基本上,如果你违反了与一个class级的合同,那么就不需要按照你期望的方式行事。 从另一个方向来看,课堂上的承诺是,如果你遵循它所规定的规则,它将按照API所说的方式行事。

Java中契约的一个常见示例是覆盖hashCode()时覆盖equals() 。 根据契约,两个被认为相等的对象必须具有相同的哈希码。 编写语法正确且不遵守此规范的代码是可能的,但它可能无法正常工作,这是程序员违反合同的错误。

Java或任何其他OO语言的类或接口的合同通常是指该类接口的公开方法(或函数)和属性(或字段或属性) 以及适用于这些公共接口的任何注释或文档。方法和属性。

在类和子类之间的关系的情况下,任何受保护的方法或属性将被视为“公开暴露”,在它们暴露给子类的意义上。