java - 在Java中绕过子类中的final方法?

标签 java inheritance final

我现在正在学习继承,我对在父类(super class)中声明方法final适用于子类的限制有点困惑。 假设我有一个带有提款方法的父类(super class) BankAccount,它需要用户密码和提款金额,并将帐户余额设置为(余额 - 金额)。我想将该方法声明为 final方法,以便其他子类不会潜在地覆盖它并允许客户在不更改帐户余额的情况下提取资金。

public final void withdraw(double amount, String pass) {
    if (checkPassword(pass) && getBalance() >= amount;) {
        setBalance(getBalance() - amount);
    } else {
        System.out.println("Rejected.");
    }
}

我想避免允许这样的事情:

public void withdraw(double amount, String pass) {

}

但是,一些银行账户允许 overdraw ,提款时也必须考虑 overdraw 。现在,如果我有一个子类 BankAccountOverdraft,继承的提款方法是 final方法,因此我无法更改它的任何部分。但是,我仍然必须考虑子类中的 overdraw 限额?我怎样才能做到这一点?

    public void withdraw(double amount, String pass) {
    if (checkPassword(pass) && getOverDraftLimit() + getBalance() >= amount) {
        setBalance(getBalance() - amount);
    } else {
        System.out.println("Rejected.");
    }
}

最佳答案

您需要问的问题: overdraw 账户的提现流程是否有所不同?不,事实并非如此,过程是相同的:检查密码,检查是否有足够的资金,然后从帐户中扣除。

不同的是检查是否有足够的资金步骤。因此,您的抽象应该反射(reflect)这一点,就像 checkPassword() 一样。

public final void withdraw(double amount, String pass) {
 if (checkPassword(pass) && checkFundsAvailable(amount)) {
    setBalance(getBalance() - amount);
 } else {
    System.out.println("Rejected.");
 }
}

protected boolean checkFundsAvailable(double amount) {
  return amount <= getBalance();
}

当您可以 overdraw 时,您可以使用以下方法覆盖它:

protected boolean checkFundsAvailable(double amount) {
  return amount <= getBalance() + overdraftLimit;
}

这样你的父类(super class)就不必了解 overdraw 限制或任何其他事情。您可以将锁定帐户实现为其子类,该帐户会拒绝所有提款请求,或者您可以将任何其他逻辑放入 checkFundsAvailable() 中。

P.s.:尽管有上述情况,我们还是有充分的理由不通过继承来解决这个问题(如果这是一个真正的问题而不仅仅是一个练习),但它更加微妙。通过拥有 BankAccount 类和 BankAccountOverdraft 子类,您还声称不允许 overdraw 的帐户永远不会变成可 overdraw 的帐户,反之亦然。但真正的银行账户不会这样,你可以一开始不允许 overdraw ,然后再同意 overdraw 限额。继承无法表达这一点,您需要使用某种形式的组合。

关于java - 在Java中绕过子类中的final方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33711390/

相关文章:

java - 如何从java代码中获取控制台命令的结果?

java嵌套接口(interface)和内部类

c++ - 为什么这段代码允许在 Visual Studio 2013 下编译?

java - 具有最终类系统和静态方法 currentTimeMillis 的 PowerMock

java - Nashorn java.lang.NoClassDefFoundError : jdk/nashorn/api/scripting/JSObject

java - JSlider 更改监听器不工作

java - 从 appengine 与 SVN 交互

c# - 如何使用 protobuf-net 代理序列化继承链中的类型?

c++ - 允许这种派生到基础转换的理由是什么(当它似乎违反 IS-A 时)?

inheritance - TypeScript 中的自定义错误类