2013-10-23 78 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); 
} 
相關問題