2013-10-23 4 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)가 :

나는이 부모 클래스가 있습니다.

하위 클래스입니다 : 내가해야 할 것은 인쇄를위한 JOptionPane의 체크 숫자 밖으로

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

사용자가 그들을 위해 요청하는 경우. 메인에서

나는이 :

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는 다른 클래스에 있습니다 확인 계정 : 그 곳이 아니다 이후 Check 이후

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

는, 당신은 Transaction의 목록에 getCheckNumber()를 호출 할 수 없습니다 Transaction의 특별한 종류 getCheckNumber() 메서드가 선언되었습니다.

: 당신이 Transaction의 (일부는 Transaction의 다른 종류입니다 일부 Check들입니다)의 이종 목록이있는 경우 수행 할 수있는

는 각 목록 항목에 대해 다음과 같은 것입니다

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

물론이 경우 Check이되지 않는 항목에 대해서는 -1 (또는 기본 체크 번호를 만드는 번호)을 처리 할 준비가되어 있어야합니다.

편집 :

호버의 완벽하게 합리적인 의견 @ 해결하기 위해 ... 나는 당신이 아마 대신 getCheckNumber() 방법을 Check을주는, getTransId()를 오버라이드 (또는 다른 방법을 제공, 수행 할 작업을 말할 것 Transaction을 일종의 일반적인 방법으로 식별) 다른 하위 클래스 (있는 경우)와 동일한 패턴을 따라 다른 하위 클래스 (Transaction)와 함께 체크 번호를 반환합니다. 그런 식으로 Transaction 개체 이상의 루프는 불쾌한 캐스트를 필요로하지 않습니다.

+0

우, 나쁜 코드 냄새! –

+0

동의합니다. 나는 그것이 좋은 디자인이라고 말하지 않았다 ... 물론, 왜 내가 그것을 게시했는지에 관해서 질문을 구걸한다, 그렇지? 물론 이런 종류의 사용 사례가 있습니다. 이것은 하나가 아닐 수도 있지만 새로운 인터페이스를 작성하는 기분이 아닌 것 같습니다. – Josh

2

클래스를 만들 때 has-ais-a 관계를 생각해 봐야합니다.

귀하의 경우

예,

당신은 Transaction 클래스가 있습니다. Check 클래스는 extends Transaction입니다.extend 일 때 Checkis-aTransaction이 아니며 이는 사실이 아닙니다. 하지만 Transactionhas-a (또는 대답) Check? 예! 이 경우에 그래서, 당신은 Transaction의 확장되는 것을 Check을 분리하고 같은 것을 할 것입니다 : Accounthas-a을 수행하기 때문에 당신이 ArrayListCheck의의를 원하는 경우에

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 클래스에 넣어 것 checkHistory

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

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

그래서 당신은 완벽한 이해

을 만드는 Account 클래스에서 checkHistory를 호출 할 수 있습니다 (A가)
Account myAccount = new Account(); 

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

for (Check check : list) { 
    System.out.print(check.someCheckProperty); 
} 
관련 문제