0

我如何调用扩展主类的类的 setter 和 getter。我有我的主类 BankAccount,并且我有扩展 BankAccount 的 CheckingAccount

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,但没有可用的。

我的图形用户界面:

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");


        }
4

3 回答 3

0

BankAccount例如,需要实现基类setOverdraftProtection以使其可用于所有实现而无需向下转换

BankAccount account = new CheckingAccount();
account.setOverdraftProtection(2000);

setOverdraftProtection可以声明为abstract避免给基类任何实现。

public class BankAccount  {
  public abstract void setOverdraftProtection(double overdraftProtection);
  ...
}

旁白:实际上,您永远不会使用double来表示货币数量-BigDecimal而是会被使用。

于 2013-05-31T02:58:29.353 回答
0

创建的对象类型是 BankAccount,因此它不知道 CheckingAccount 方法。通过在 BankAccount 中声明或简单选项来覆盖该方法

if(account instanceof Checkingaccount)

account.setOverdraftProtection(2000);

于 2013-05-31T03:08:25.667 回答
0

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

每个 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
于 2013-05-31T03:16:15.783 回答