我现在正在学习继承,我对在父类(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/