从父类的对象的数组列表中调用子类的方法

时间:2013-10-23 00:16:41

标签: java

我已经找到了解决方案,但我仍然不明白该怎么做。这个程序应该模仿一台atm机器,它通过支票从余额中减去,并通过存款增加资金。

我有这个父类:

public class Transaction
{

private int transNumber;
private int transId;
private double transAmt;

public Transaction(int number, int id, double amount)
{
    transNumber = number;
    transId = id;
    transAmt = amount;
}

public int getTransNumber()
{
    return transNumber;
}

public int getTransId()
{
    return transId;
}

public double getTransAmount()
{
    return transAmt;
}
}

我有一个数组列表(transList),用于存储每个撤销/存款的Transaction对象。

儿童班是:

public class Check extends Transaction
{
private int checkNumber; // check number for each check transaction

public Check(int tId, double tAmt, int tCount, int checkNumber) {
    super(tCount, tId, tAmt);
    this.checkNumber = checkNumber;
}

public int getCheckNumber() {
    return checkNumber;
}

public void setCheckNumber(int checkNumber) {
    this.checkNumber = checkNumber;
}
}

我需要做的是在JOptionPane中打印支票编号,如果用户要求的话。

主要是我:

checkNumStr = JOptionPane.showInputDialog("Enter check number:");
                checkNum = Integer.parseInt(checkNumStr);
                checkAmtStr = JOptionPane.showInputDialog("Eneter check amount:");
                checkAmt = Double.parseDouble(checkAmtStr);

                Check c = new Check(1, checkAmt, acctCheck.gettransCount(), checkNum);

                acctCheck.addTrans(c);

我不确定我是否已经足够清楚了。我之前没有问过这个问题。我需要知道的是如何从父类Transaction的对象的数组列表中调用Check.getCheckNumber()。

编辑:transList位于另一个类:检查帐户:

public class CheckingAccount extends Account
{
  private double totalServiceCharge;
  private static ArrayList<Transaction> transList;
  // keeps a list of Transaction objects for the account
  private int transCount = 0;   
  // the count of Transaction objects and used as the ID for each transaction
  NumberFormat fmt = NumberFormat.getCurrencyInstance();



  public CheckingAccount()
  {
      transList = new ArrayList<Transaction>();
      totalServiceCharge = 0;
  }

  public double getServiceCharge()
  {
        return totalServiceCharge;
  }

    public void setServiceCharge(double currentServiceCharge)
  {
        totalServiceCharge += currentServiceCharge;
  }

    // adds a transaction object to the transList
    public void addTrans(Transaction newTrans)
    {
        transList.add (newTrans);
        transCount++;
    }

    //returns the current value of transCount;
    public int gettransCount()
    {
        return transCount;
    }
}

2 个答案:

答案 0 :(得分:2)

在构建课程时,您应该考虑has-a is-a关系。

您的案例中的一个例子,

你有一个Transaction课程。您有一个Checkextends Transaction。当您extend时,您说的是Check is-a Transaction,这不是真的。但是Transaction has-a(或拥有)Check?是!因此,在这种情况下,您可以将CheckTransaction的扩展分开,并执行以下操作:

public class Transaction {
    Check check;  // This is an example of a has-a relationship
} 

public class Check {  // notice how Check doesn't extend Transaction
                      // anymore.  As it shouldn't, because they don't
}                     // share any common properties

如果您需要ArrayList Check,我会将其放在Account课程中,因为Account执行has-a(拥有){ {1}}

checkHistory

所以你可以从public class Account { ArrayList<Check> checkHistory = new ArrayList<Check>(); public ArrayList<Check> getCheckHistory() { return checkHistorty; } } 类调用checkHistory,这很有意义

Account

答案 1 :(得分:1)

由于Check是一种特殊的Transaction,因此您无法在getCheckNumber()列表中调用Transaction,因为这不是getCheckNumber()的位置声明了方法。

如果您有Transaction的异构列表(其中一些是Check s,其中一些是其他类型的{{1},那么可以做什么对于每个列表项,类似于以下内容:

Transaction

当然,在这种情况下,您必须准备好处理int checkNum = -1; if (trans instanceof Check) { checkNum = ((Check) trans).getCheckNumber(); } .... (或任何您为默认支票编号设置的内容),以查找最终不是-1的项目。

修改

要解决@ Hovercraft完全合理的评论......我会说你可能想要做的是,而不是给Check Check方法,覆盖getCheckNumber()(或提供另一种以一般方式识别getTransId()的方法,并从那里返回校验码,与其他Transaction子类相同,如果有的话。这样,Transaction个对象上的循环不需要一堆讨厌的强制转换。