从类和子类的名称来看,似乎子类是类的一个分支或者特例。
今天看到一篇文章,正方形是矩形的一个特例,矩形有两个属性,长和高。可当这个特性应用到矩形的子类,也就是正方形上时,可能会导致错误。
原因是矩形可以改变独自改变长或高,可当这个特性应用到正方形上时,则正方形不再是正方形。
矩形的长和高分别改变并没有错,错就在于里面有隐含的假设,正方形除了长等于高,就没有其它约束了。
这就引出了合约设计,不管是条件还是隐含的假定,都使用明确的语言定义,并写进文档,甚至在有的语言中,这已经被明确地写进了程序。
例如python中的finally,世界上就是合约设计的一种。
合约设计有三个部分,前置条件、后置条件和不变项。
前置条件必须为真,才会执行程序。程序结束时,后置条件也必须为真,要不就会出现异常。
这两点都比较好理解,例如对两个正整数求和,前置条件是必须输入两个正整数,而不是负数或者浮点小数;后置条件是得到那两个数的和,而且类型也是正整数。
当然关于参数的类型和值应该由谁来改变,也有了答案,也就是调用者负责格式化数据。
比较难理解的是不变项,按照作者的说法,这应该是在程序执行过程中,用户能察觉的阶段,一直为真的条件。比较抽象,也并没有说的很清楚。