这个前提条件是否违反了里氏替换原则

2024-01-08

我有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(使用前将#替换为@)

这个前提条件是否违反了里氏替换原则 的相关文章

随机推荐