基于契约和类不变量的java设计 4 月 Questions & Answers 3619 我正在读关于dbc(http://en.wikipedia.org/wiki/Design_by_contract) 有人能给我一个简单的例子,说明在继承方面使用类不变量吗
# 1 楼答案 在继承类中,不变量至少应该是同样严格的,但它们可以更严格。如果派生类中省略了一个不变量,则基类的不变量当然适用 例如: // Class invariant : sum should be > -1000 Account { public int sum; } // Class invariant : sum should be >= 0 AccountForKids : inheritsFrom Account { public int sum; } 儿童账户不应低于零,但这当然大于-1000 一般来说:当类不变量变得更严格时,派生类的契约总是受到追捧
# 3 楼答案 契约式设计概念在适应面向对象语言时会变得稍微复杂一些 类不变量是一个属性,当调用一个方法时,该类的每个实例都保证具有该属性(如所有方法的公共前置条件),作为回报,每个方法和构造函数必须确保在终止时保持为真(如公共后置条件) 它们有助于表达一致性条件。对实际钱包进行建模的Wallet类可能具有类不变量,即包含的金额始终为正 类不变量与契约的其余部分一样,是继承的。方法的新实现必须提供与其替代的方法相同的保证
# 1 楼答案
在继承类中,不变量至少应该是同样严格的,但它们可以更严格。如果派生类中省略了一个不变量,则基类的不变量当然适用
例如:
儿童账户不应低于零,但这当然大于-1000
一般来说:当类不变量变得更严格时,派生类的契约总是受到追捧
# 2 楼答案
派生类不变量应该:
# 3 楼答案
契约式设计概念在适应面向对象语言时会变得稍微复杂一些
类不变量是一个属性,当调用一个方法时,该类的每个实例都保证具有该属性(如所有方法的公共前置条件),作为回报,每个方法和构造函数必须确保在终止时保持为真(如公共后置条件)
它们有助于表达一致性条件。对实际钱包进行建模的
Wallet
类可能具有类不变量,即包含的金额始终为正类不变量与契约的其余部分一样,是继承的。方法的新实现必须提供与其替代的方法相同的保证