我已经找到了解决方案,但我仍然不明白该怎么做。这个程序应该模仿一台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;
}
}
答案 0 :(得分:2)
在构建课程时,您应该考虑has-a
is-a
关系。
您的案例中的一个例子,
你有一个Transaction
课程。您有一个Check
班extends Transaction
。当您extend
时,您说的是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
如果您需要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
个对象上的循环不需要一堆讨厌的强制转换。