如何调用扩展主类的类的setter和getter。 我有我的主类,BankAccount,我有CheckingAccount扩展BankAccount
public class CheckingAccount extends BankAccount {
private double overdraftProtection;
public CheckingAccount(){
};
public CheckingAccount(String accountNo, String accountName,
double initBalance) {
super(accountNo, accountName, initBalance);
}
public CheckingAccount(String accountNo, String accountName) {
super(accountNo, accountName);
}
public double getOverdraftProtection() {
return overdraftProtection;
}
public void setOverdraftProtection(double overdraftProtection) {
this.overdraftProtection = overdraftProtection;
}
public void withdraw(double amount) {
// TODO: code for withdrawal
}
在我的GUI中,我想调用支票帐户的setter和getter。我已经尝试account.setOverdraftProtection
,但没有可用的。
我的GUI:
private void btnSaveAActionPerformed(java.awt.event.ActionEvent evt) {
if(rad_savings.isSelected()){
account.setAccountType("Savings");
account.setInterest(Double.parseDouble(txt_interestrate.getText()));
}
else{
account = new CheckingAccount();
account.setAccountType("Checking");
}
答案 0 :(得分:0)
基类BankAccount
是实现setOverdraftProtection
所必需的,它可以在没有向下转换的情况下用于所有实现,例如
BankAccount account = new CheckingAccount();
account.setOverdraftProtection(2000);
setOverdraftProtection
可以声明为abstract
,以避免给基类赋予任何实现。
public class BankAccount {
public abstract void setOverdraftProtection(double overdraftProtection);
...
}
除此之外:实际上,您永远不会使用double
来代表货币金额 - 而是会使用BigDecimal
。
答案 1 :(得分:0)
创建的对象类型是BankAccount,因此它不知道CheckingAccount方法。通过在BankAccount中声明来覆盖该方法 或者简单的选择
if(account instanceof Checkingaccount)
account.setOverdraftProtection(2000);
答案 2 :(得分:0)
由于只有CheckingAccounts
可以拥有透支保护,因此您需要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
只能是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