由于 onlyCheckingAccounts
可以具有透支保护,因此您需要一个BankAccountPanel
仅具有 中的项目的小部件BankAccount
,并且您需要一个CheckingAccountPanel
可以扩展它的具有CheckingAccount
项目的小部件的小部件。
因此,这是我建议的两个帐户类别。当然,一个真实的系统会有一个数据库。
public abstract class BankAccount {
private final String id;
private final Owner owner;
private BigDecimal balance;
// constructors, getters, toString elided. No setters.
public final void deposit(BigDecimal amount) throws BankException {
mayDeposit(amount); //Throw if amount <= 0. Elided.
balance = balance.add(amount);
}
public final void withdraw(BigDecimal amount) throws BankException {
mayWithdraw(amount);
balance = balance.subtract(amount);
}
/**
* Throw an exception if the owner tries to withdraw more money than he has.
* @throws BankException If withdrawl < 0 or withdrawl >= balance.
*/
protected void mayWithdraw(BigDecimal withdrawal) throws BankException {
if (withdrawal.signum() != 1) {
throw new BankException();
}
if (balance.compareTo(withdrawal) < 0) {
throw new BankException();
}
}
}
public class CheckingAccount extends BankAccount {
private BigDecimal overdraftLimit;
private BankAccount overdraftAccount;
// constructors, etc.
// getters and setters for overdraft variables.
protected void mayWithdraw(BigDecimal withdrawal) throws BankException {
if (withdrawal.signum() != 1) {
throw new BankException();
}
if (balance.add(overdraftLimit).compareTo(withdrawal) < 0) {
throw new BankException();
}
}
}
现在,我已经有一段时间没有做 Swing 了,我不会花一个小时来填写一个完整的例子。我建议你创建一个JPanel
并给它一个BorderLayout
.
在NORTH
它的一部分,我会输入所有者的信息,然后是一组用于帐户类型的单选按钮。在其中的CENTER
一部分,我会放置一个专用的 CheckingAccountPanel 或 SavingsAccountPanel,或者您的帐户类型所需的任何类型的面板。如果用户选择一个新的单选按钮,您可以将此处的帐户面板换成新需要的。您将为此使用事件。在主面板的SOUTH
部分,我会放置Create
和Cancel
按钮。
每个 XXXAccountPanel 都将绑定到一个 XXXAccount,并在用户输入值时填写它。因此,您可以拥有一个带有 id、所有者和余额的 BankAccountPanel,您可以扩展它或在具有 interestRate 的 SavingsAccountPanel 中使用它。但是 SavingsAccountPanel 将与 SavingsAccount 一起使用,因此不会对其设置透支保护。CheckingAccountPanel 不会设置利率。
注释
我没有在我的家庭系统上创建这些类,但是看看下面类似的代码和编译结果。该变量n
只能是 a BigDecimal
,但您不能BigDecimal
在其上调用特定方法。
import java.math.BigDecimal;
public class NumberTest {
public static void main(String[] args) {
Number n = new BigDecimal("42");
System.out.println(n.toEngineeringString());
}
}
来自javac
:
NumberTest.java:6: cannot find symbol
symbol : method toEngineeringString()
location: class java.lang.Number
System.out.println(n.toEngineeringString());
^
1 error