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

2 に答える 2

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に入れます。AccountAccounthas-acheckHistory

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

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

checkHistoryしたがって、クラスからを呼び出すことができますAccount。これは完全に理にかなっています

Account myAccount = new Account();

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

for (Check check : list) {
    System.out.print(check.someCheckProperty);
}
于 2013-10-23T00:54:48.970 に答える
1

Checkは特別な種類の であるため、メソッドが宣言されている場所ではないため、 のリストをTransaction呼び出すことはできません。getCheckNumber()TransactiongetCheckNumber()

異種のs のリスト (一部は であり、一部は他の種類の です) がある場合にできることは、各リスト項目に対して次のようなものです。TransactionCheckTransaction

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

もちろん、この場合、最終的にs-1にならないアイテムの に対処する準備ができている必要があります。Check

編集:

@Hovercraftの完全に合理的なコメントに対処するには...おそらくやりたいことは、メソッドを指定する代わりに、オーバーライド(または一般的Checkな方法で sを識別するための別のメソッドを提供)してからチェック番号を返すことだと思います他のサブクラスがある場合は、同じパターンに従います。そうすれば、オブジェクトのループに面倒なキャストは必要ありません。getCheckNumber()getTransId()TransactionTransactionTransaction

于 2013-10-23T00:28:43.783 に答える