2013-10-23 117 views
3

我已经搜索了一个解决方案,但我仍然不明白在这里要做什么。这个程序应该模仿一个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); 

我不知道我是否已经足够清晰。我以前没有在这里提过一个问题。我需要知道的是如何从父类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; 
    } 
} 
+1

答案是 - 不要这样做。你的Transaction类不应该拥有这个ArrayList,因为它属于其他地方,而不是父类。 –

回答

1

由于Check是一种特殊的Transaction,你不能叫getCheckNumber()Transaction秒的名单上,因为这不是在getCheckNumber()方法被声明。

可以做什么,如果你有Transaction S(其中一些是Check S,其中一些是一些其他类型的Transaction)异构名单是像每个列表项下:

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

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

编辑:

为了解决@气垫船的完全合理的意见......我说什么你可能想要做的是,而不是给Check一个getCheckNumber()方法,覆盖getTransId()(或提供另一种方法以一种通用的方式识别Transaction),并从那里返回支票号码,如果有的话,跟其他Transaction子类一样。这样一来,对象上的循环就不需要一堆令人讨厌的强制转换。

+0

唉,糟糕的代码味道! –

+0

我同意;我没有说这是个好设计......当然,这引发了我为什么要发布它的问题,不是吗?当然,这种事情有用例。虽然这可能不是一个,但我想我不想写一个新的界面,等等。 – Josh

2

当你建立课堂时,你应该考虑has-ais-a的关系。

你的情况的一个例子,

你有Transaction类。你有一个Check类,extends Transaction。当你extend,你说的是Checkis-aTransaction,这是不正确的。但是Transactionhas-a(或有)Check?是!因此,在这种情况下,你会被的Transaction加长独立Check,做这样的事情:如果你想CheckArrayList一个S

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 

,我把它放在Account类,因为一个Account确实has-a (有)checkHistory

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

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

所以,你可以从Account类,这是非常合情合理的

拨打
Account myAccount = new Account(); 

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

for (Check check : list) { 
    System.out.print(check.someCheckProperty); 
} 
相关问题