什么是"合同"类是什么意思

Lee*_*fin 30 java inheritance

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

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

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

Dav*_*vid 36

Java类中的契约类似于现实世界中的契约 - 以非技术术语:

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

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

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

按合同设计

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

  • "规范"可以用于表示实现的细节,即受保护的和私有的方法和属性."合同"实际上只意味着公共方法和财产. (5认同)

Vic*_*kin 5

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

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

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

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

关于类型契约的其他重要方面是子类型可以具有更强的契约(涵盖类型契约中的约束子集),但不能具有较弱的契约(涵盖类型契约中约束的超集).例如,如果类型的方法'doX(n)'承诺采用O(n)(线性)时间,则子类型中的'doX(n)'可以花费O(1)(恒定)时间,但不能花费O(n^2)时间.