我有3节课,Account
, CappedAccount
, UserAccount
,
CappedAccount
, and UserAccount
两者都延伸Account
.
Account
包含以下内容:
abstract class Account {
...
/**
* Attempts to add money to account.
*/
public void add(double amount) {
balance += amount;
}
}
CappedAccount
覆盖此行为:
public class CappedAccount extends Account {
...
@Override
public void add(double amount) {
if (balance + amount > cap) { // New Precondition
return;
}
balance += amount;
}
}
UserAccount
不重写任何方法Account
,所以不需要说明。
我的问题是,CappedAccount#add
违反了LSP,如果违反了,我该如何设计它以符合LSP。
例如,是否add()
in CappedAccount
算不算“强化前提”?
请务必记住 LSP 涵盖语法和语义。它涵盖both该方法的编码目的是做什么,and记录该方法的用途。这意味着模糊的文档可能会导致 LSP 的应用变得困难。
您如何解释这一点?
尝试向帐户添加资金。
很清楚的是add()
方法不保证给账户充值;所以事实是CappedAccount.add()
可能实际上不加钱似乎可以接受。但没有任何文件说明当尝试加钱失败时应该预期什么。由于该用例没有记录,“不执行任何操作”似乎是可接受的行为,因此我们没有违反 LSP。
为了安全起见,我会修改文档来定义失败的预期行为add()
即明确定义后置条件。由于 LSP 涵盖语法和语义,因此您可以通过修改其中之一来修复违规问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)