我正在读"Java编程语言 "一书.在解释最重要方法的章节中,它说:
使覆盖方法(在子类中)比在超类中更难访问会违反超类的合同......
整个案文是可以理解的.我唯一的问题是什么是超类的合同?合同对Java类意味着什么?
Dav*_*vid 36
Java类中的契约类似于现实世界中的契约 - 以非技术术语:
这是一个协议,该类将暴露某些方法,某些属性和某些行为.
更多技术,从这里 :(大胆加我)
如果你使用的所有Java类,包括你自己的Java类都兑现了他们的承诺,那不是很好吗?事实上,如果你真的确切地知道某个班级所承诺的是什么,那不是很好吗?如果您同意,请继续阅读[...]
按合同设计
合同设计(DBC)软件开发技术通过保证系统的每个组件都达到预期,确保了高质量的软件.作为使用DBC的开发人员,您可以将组件合同指定为组件接口的一部分.合同规定了该组件对客户的期望以及客户对其的期望.
类型(类,接口,枚举)的合同是这种类型承诺遵守的合同.它指出:
addData(float)的MathAverage类方法可以说明每次调用add(float)返回时,您应该期望调用MathAverage.getAverage()返回当前输入的正确平均值.合同在javadoc类型中以自由格式指定.有一些工具/实践来强制执行合同,但它们是有限的,正是因为在程序员错误的情况下,合同可能是任意的,甚至是自相矛盾的.
由于子类型(子类化)可以以任意方式扩展/修改超类型方法的行为,因此它也可能违反超类型契约的某些部分.这样的示例将是扩展HashMap,它接受null值和键,其中一些实现禁止null调用它的方法中的值.
关于类型契约的其他重要方面是子类型可以具有更强的契约(涵盖类型契约中的约束子集),但不能具有较弱的契约(涵盖类型契约中约束的超集).例如,如果类型的方法'doX(n)'承诺采用O(n)(线性)时间,则子类型中的'doX(n)'可以花费O(1)(恒定)时间,但不能花费O(n^2)时间.