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

Java 从父类的对象数组列表调用子类的方法,java,Java,我一直在寻找解决办法,但我还是不知道该怎么办。这个程序应该模拟atm机,用支票从余额中减去,用存款加钱 我有一个父类: public class Transaction { private int transNumber; private int transId; private double transAmt; public Transaction(int number, int id, double amount) { transNumber = number; tran

我一直在寻找解决办法,但我还是不知道该怎么办。这个程序应该模拟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),用于存储每次取款/存款的交易对象

儿童班是:

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);
我不确定我是否已经足够清楚了。我以前没问过这个问题。我需要知道的是如何从父类事务的对象数组列表中调用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;
    }
}
公共类CheckingAccount扩展帐户
{
私人双重收费;
私有静态数组列表;
//保留帐户的事务对象列表
私有整数转数=0;
//事务对象的计数,并用作每个事务的ID
NumberFormat fmt=NumberFormat.getCurrencyInstance();
公共检查帐户()
{
transList=newarraylist();
总服务费=0;
}
公共服务双重收费()
{
返回总服务费;
}
公共无效设置服务费(双倍当前服务费)
{
总服务费+=当前服务费;
}
//将事务对象添加到transList
公共无效addTrans(交易新Trans)
{
transList.add(newTrans);
transCount++;
}
//返回transCount的当前值;
public int gettransCount()
{
返回转数;
}
}

由于
Check
是一种特殊的
事务
,因此不能在
事务
列表上调用
getCheckNumber()
,因为
getCheckNumber()
方法不是在这里声明的

如果您有一个异构的
事务
s列表(其中一些是
检查
s,一些是其他类型的
事务
),您可以为每个列表项执行以下操作:

int checkNum = -1;
if (trans instanceof Check) {
    checkNum = ((Check) trans).getCheckNumber();
}
....
当然,在这种情况下,您必须准备好处理不属于
check
s的项目的
-1
(或任何您设置的默认检查编号)

编辑:


为了解决@Hovercraft的完全合理的评论…我想说的是,您可能想做的是,不给
Check
一个
getCheckNumber()
方法,而是覆盖
getTransId()
(或者提供另一种方法,以一种通用的方式识别
事务
并从那里返回检查编号,与其他
事务
子类(如果有)遵循相同的模式。这样,循环
事务
对象就不需要一堆讨厌的强制转换。

当您构建类时,您应该考虑
has-a
is-a
关系

以你为例,

您有一个
事务
类。您有一个
Check
类,该类
扩展事务
。当您扩展
时,您是说
检查
是一个
事务
,这是不正确的。但是
事务
是否有-a
(或有a)
检查
?对因此,在这种情况下,您可以将
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
如果您想要一个
Check
s的
ArrayList
,我会把它放在
Account
类中,因为
Account
有一个
checkHistory

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

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

答案是——不要这样做。您的事务类不应该拥有此ArrayList,因为它属于其他地方,而不属于父类;我并没有说这是一个好的设计……当然,这就引出了一个问题,那就是我为什么要发布它,不是吗?当然,这类事情也有使用案例;虽然这可能不是一个,我想我不想写一个新的接口,等等。
Account myAccount = new Account();

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

for (Check check : list) {
    System.out.print(check.someCheckProperty);
}