4

私は私が終わらせようとしているいくつかのコースの仕事に問題があります、そしてどんな助けもいただければ幸いです!

抽象型「アカウント」を拡張する3種類のアカウントがあります。[CurrentAccount、StaffAccount、MortgageAccount]。

ファイルからいくつかのデータを読み込み、ユーザーオブジェクトとともにアカウントオブジェクトを作成して、プログラム内に保存されているハッシュマップに追加しようとしています。

アカウントオブジェクトを作成するときは、Accountタイプの一時変数を使用し、読み込まれたデータに応じてそのサブタイプを定義します。

例えば:

Account temp=null;

if(data[i].equalsIgnoreCase("mortgage"){
    temp= new MortgageAccount;
}

問題は、MortgageAccount。タイプに属するメソッドを呼び出そうとしたときです。

各タイプの一時変数、StaffAccount MortgageAccountおよびCurrentAccountが必要であり、それらのメソッドを使用するためにそれらを対応して使用しますか?

前もって感謝します!

4

4 に答える 4

9

すべてのアカウントオブジェクトが同じインターフェイスを持っている場合、つまり、同じメソッドを宣言し、実装方法が異なるだけの場合は、タイプごとに変数は必要ありません。

ただし、サブタイプに固有のメソッドを呼び出す場合は、そのタイプの変数が必要になるか、メソッドを呼び出す前に参照をキャストする必要があります。

class A{
    public void sayHi(){ "Hi from A"; }
}


class B extends A{
    public void sayHi(){ "Hi from B"; 
    public void sayGoodBye(){ "Bye from B"; }
}


main(){
  A a = new B();

  //Works because the sayHi() method is declared in A and overridden in B. In this case
  //the B version will execute, but it can be called even if the variable is declared to
  //be type 'A' because sayHi() is part of type A's API and all subTypes will have
  //that method
  a.sayHi(); 

  //Compile error because 'a' is declared to be of type 'A' which doesn't have the
  //sayGoodBye method as part of its API
  a.sayGoodBye(); 

  // Works as long as the object pointed to by the a variable is an instanceof B. This is
  // because the cast explicitly tells the compiler it is a 'B' instance
  ((B)a).sayGoodBye();

}
于 2011-11-21T05:25:46.700 に答える
7

場合によります。親クラスAccountにでオーバーライドされたメソッドがあるMortgageAccount場合、メソッドを呼び出すとMortgageAccountバージョンが取得されます。メソッドがにのみ存在する場合は、メソッドMortgageAccountを呼び出すために変数をキャストする必要があります。

于 2011-11-21T05:12:33.460 に答える
4

必要なのは、MortgageAccountメソッドを呼び出す型のオブジェクトだけです。オブジェクトtempは型であるため、そのオブジェクトに対してメソッドをMortgageAccount呼び出すだけMortageAccountで済みます。Accountキャスティングは必要ありません。

于 2011-11-21T05:08:59.773 に答える
4

これがDynamic method dispatch

基本クラスの参照変数を使用して派生クラスのオブジェクトを作成している場合は、基本クラスで定義されているか、少なくとも宣言されているメソッドにのみアクセスでき、派生クラスでそれらをオーバーライドしています。

派生クラスのオブジェクトを呼び出すには、派生クラスの参照変数が必要です。

于 2011-11-21T05:11:04.163 に答える