从主类中扩展的类调用setter和getter

时间:2013-05-31 02:48:45

标签: java swing arraylist getter-setter

如何调用扩展主类的类的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");


        }

3 个答案:

答案 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部分,我会放置CreateCancel按钮。

每个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