1

私のプログラムには、次のような4つのクラスがあります。

  • class Bank
  • class Branch extends Bank
  • class Customer extends Branch
  • class Loan extends Customer

を追加したい場合はCustomer、メイン関数からすべてのパラメーターを指定します。お気に入り:

customer(bank name, bank add, branch number, brunch add, customer info...)

このコンストラクターから、銀行の情報は、コンストラクターを使用するなどの両方をBank介してクラスに渡されます。CustomerBranchsuper()

問題はLoan、クラスを拡張する , クラスを作成したときにCustomer、コンストラクターを使用しなかったことです。また、コンストラクターも使用したくありませんCustomer。クラスの変数が 1 つだけ必要なためです。Bankしかし、私のコンパイラはこのエラーを表示していBranchますCustomer.

Loanクラスでコンストラクターを使用せずにこの問題を解決するにはどうすればよいですか?

4

3 に答える 3

1

クラスでCustomerコンストラクターを使用しないようにする最も簡単な方法は、を拡張しないことです。拡張するクラスがある場合は、それを決定するときに、「isa」テストを使用する必要があります。たとえば、aはであるため、。を使用するのは理にかなっています。ただし、これは実際には意味がないため、実行しないでください。一方、aには;があります。実際、aには複数あるか、まったくない場合があります。これは、クラスにメンバー変数(または、Container APIについて学習した場合は、おそらくsのa )を含めることが理にかなっていることを意味します。LoanCustomerBranchBankclass Branch extends BankLoanCustomerclass Loan extends CustomerCustomerLoanCustomerLoanLoanListLoanCustomer

于 2012-10-15T16:40:50.907 に答える
0

OOの考え方を修正する必要があります。

ブランチは銀行を拡張します、わかりました、私はそれと一緒に暮らすことができますが、それは良い考えではありません(おそらくデコレータパターンが行くためのより良い方法です)

顧客がブランチを拡張します。これは正しくありません(実際にライブで考えてみてください...)ブランチには顧客のコレクションがあり、必要に応じて、顧客にはフィールドブランチがある可能性があります。

ローンは顧客を拡張します。これは正しくありません。上記のように、顧客はローンのコレクションを持つことができ、必要に応じて、ローンには顧客のコレクションがある可能性があります。

したがって、オブジェクトモデルを確認することをお勧めします。

双方向参照を使用することは、本当に必要な場合にのみ有効ですが、要件がわからないため、それを決定することはできません。

読むべきいくつかの記事:

デコレータパターン

継承をめぐる構成

于 2012-10-15T16:40:11.093 に答える
0

継承を使用せず、次のクラスの参照を使用してください。

class Bank {
    private List<Loan> loans;
}

class Loan {
    private Customer customer;
}

このさまざまな方法をモデル化できます。銀行には顧客のリストとローンのリストがあり、ローンには顧客があり、顧客にはローンのリストがあります。そのタイプは「です」: Dog は Animal を拡張できますが、Dog は Kennel または Food を拡張しません。

これを行うと、Bank を作成し、その属性をコンストラクターに渡すことができます。次に Customer を作成し、Customer 属性のみをそのコンストラクターに渡します。顧客を銀行に関連付けるには、次のメソッドを Bank に追加します。

public void addLoan(Loan loan) {
    this.loans.add(loan);
}

次に、各クラスのコンストラクターは独自の属性のみを必要とします。

于 2012-10-15T16:50:27.083 に答える