【问题标题】:Calling setter and getter from a class that extends in the main class从在主类中扩展的类中调用 setter 和 getter
【发布时间】:2013-05-31 02:48:44
【问题描述】:

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


        }

【问题讨论】:

  • setOverdraftProtection() 是每个BankAccount 的实现都应该有的方法吗?
  • 不,accounttype 有一个单选按钮,如果选择了检查帐户,那是它唯一的实现时间。
  • 你为什么打电话给BankAccount你的主班?
  • @Eric Jablow -- 抱歉,伙计,您能否进一步解释您的评论?
  • 主类是什么意思?您是指具有main 方法的类吗?只是好奇。顺便问一下,你真的需要 setAccountType 方法吗?你拥有它的方式,有人可以创建一个CheckingAccount 并在其上调用`setAccountType("Savings")。最好将其设为只读并仅使用 getter。

标签: java swing arraylist getter-setter


【解决方案1】:

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

if(account instanceof Checkingaccount)

account.setOverdraftProtection(2000);

【讨论】:

  • 你还需要在这里投account
  • account=new CheckingAccount() 被调用后
  • 没关系。 account 被声明为 BankAccount。所以你只能在上面调用BankAccount方法。
  • 通过此检查,您可以在其上调用CheckingAccount 方法,因为已确认它是CheckingAccount 的实例。
【解决方案2】:

由于只有CheckingAccounts 可以具有透支保护,因此您需要一个BankAccountPanel,该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

【讨论】:

  • 抱歉拖了很长的路,但是请你给我一个例子,以便我可以一步一步地得到它。
【解决方案3】:

基类BankAccount 是实现setOverdraftProtection 所必需的,例如,它可以在所有实现中使用而无需向下转换

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

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

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

除此之外:实际上,您永远不会使用 double 来表示金额 - 而是使用 BigDecimal

【讨论】:

  • 但我有这个:private voib tnSaveAActionPerformed(java.awt.event.ActionEvent evt) { BankAccount account = new BankAccount(); account.setAccountName(txt_accountname.getText()); account.setAccountNo(txt_accountnumber.getText()); account.setBalance(Double.parseDouble(txt_initialbalance.getText())); 尝试使用 BankAccount account = new CheckingAccount(); account.setOverdraftProtection(txt_overdraft.getText()); 时出现错误
  • 编译器没有意识到account 在最后一行必须是CheckingAccount。它只知道accountBankAccount。而BankAccount没有setOverdraftProtection,所以编译器报错。使用两个不同的面板;一个用于BankAccount,一个用于CheckingAccount
  • @dyonas 声明 all BankAccount 中的预期方法,制作特定的methods 例如setOverdraftProtection abstract
  • 任何具有抽象方法的类本身必须是抽象的。原贴在他的例子中使用了new BankAccount(),所以BankAccount不能有抽象方法。
猜你喜欢
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
  • 2013-05-24
  • 2010-10-25
  • 1970-01-01
相关资源
最近更新 更多