3

我已经寻找解决方案,但我仍然不明白该怎么做。这个程序应该模仿一个自动取款机,用支票从余额中减去,用存款增加钱。

我有这个父类:

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),它为每个提款/存款存储交易对象。

子类是:

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;
    }
}
4

2 回答 2

2

当你建立类时,你应该考虑has-a is-a关系。

你的例子,

你有一Transaction堂课。你有一Check堂课extends Transaction。当 you 时extend,您说的是 a Check is-a Transaction,这是不正确的。但是有Transaction has-a(或有)Check吗?是的!因此,在这种情况下,您将与Check扩展分开Transaction并执行以下操作:

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

如果你想要一个ArrayListof Checks,我会把它放在Account课堂上,因为一个Account确实has-a(有一个)checkHistory

public class Account {
    ArrayList<Check> checkHistory = new ArrayList<Check>();

    public ArrayList<Check> getCheckHistory() {
        return checkHistorty;
    }
}

所以你可以checkHistoryAccount类中调用,这很有意义

Account myAccount = new Account();

ArrayList<Check> list = myAccount.getCheckHistory();

for (Check check : list) {
    System.out.print(check.someCheckProperty);
}
于 2013-10-23T00:54:48.970 回答
1

由于Check是一种特殊的Transaction,因此您不能调用sgetCheckNumber()的列表Transaction,因为这不是getCheckNumber()声明方法的地方。

如果你有一个异构的s 列表(其中一些是s,其中一些是其他类型的 s),你可以做什么对于每个列表项如下所示:TransactionCheckTransaction

int checkNum = -1;
if (trans instanceof Check) {
    checkNum = ((Check) trans).getCheckNumber();
}
....

当然,在这种情况下,您必须准备好处理-1最终不是Checks 的项目(或任何您设置的默认支票号码)。

编辑:

为了解决@Hovercraft 的完全合理的评论......我想说的是,您可能想要做的是,而不是提供Check方法,而是getCheckNumber()覆盖getTransId()(或提供另一种以Transaction通用方式识别 s 的方法)并从在那里Transaction,如果有的话,遵循与其他子类相同的模式。这样,Transaction对象上的循环就不需要一堆讨厌的演员表。

于 2013-10-23T00:28:43.783 回答