0

こんにちは私はクラスプロパティと2つのサブクラスショップアパートを持っています。

別のクラスでは、ショップとアパートが混在するプロパティの配列リストがあります。私はコードを持っています:

for(Property prop: properties){
  if(prop.getClass().equals(Shop.class))
       prop.setShopDetails(detail);
  else
       prop.setAppDetails(detail)
}

ショップクラス内のメソッドsetShopDetails()にアクセスするにはどうすればよいですか?

4

3 に答える 3

6

propにキャストする必要がありますShop

for(Property prop: properties){
  if(prop.getClass().equals(Shop.class))
       ((Shop) prop).setShopDetails(detail);
  else
       ((Apartment) prop).setAppDetails(detail)
  }
}

ただし、より良いアプローチはsetDetailsPropertyクラスで抽象メソッドを定義し、サブクラスごとに異なる方法で実装することです。prop instanceof Shopの代わりに使用することもできますprop.getClass().equals(Shop.class)

于 2012-04-22T18:49:10.120 に答える
2

まず、propがのサブクラスである場合を考えてみましょうShop。if条件が返されfalseます!これは、instanceof演算子を使用するのに最適なタイミングです。

これらのメソッドにアクセスするには、オブジェクトを正しいサブクラスにキャストする必要があります。

if(prop instanceof Shop) {
    Shop s = (Shop) prop;
    s.setShopDetails(details);
} else {
    // you get the idea
}

ただし、この種のポリモーフィズムの目的は無効になります。setDetailsでメソッドを作成し、Propertyサブクラスがそれをどのように処理できるようにしてみませんか?

于 2012-04-22T18:51:08.523 に答える
0

まず、この状況で電話をかけなければならないという事実は、getClass()通常、設計に欠陥があることを示しています。abstract setDetailsサブクラスによってオーバーライドされる単一のメソッドが必要になる場合があります。

あなたが探している言語機能は「キャスト」です。Propertyサブクラスメソッドを呼び出す前に、次のようにキャストします。

((Shop)prop).getShopDetails(detail);

于 2012-04-22T18:50:25.047 に答える