0

説明のために、次のような古典的な階層があるとします。

abstract class Vehicle {
  private int cost; 
  // imagine the usual getters and setters here
}

class Car extends Vehicle {
  private String make, model, year; 
  // getters and setters
}

class Plane extends Vehicle {
  private int yearIntroduced;
  // getter and setter
}

ここで、バッキングBeanにVehicleインスタンスのリストがあるとしますbb.vehicles。統一編集をサポートするにはどうすればよいですか?この種のコードを回避する方法がわかりません。

<ui:repeat value="#{bb.vehicles}" var="vehicle">
  <!-- this is where the trouble begins -->
  <app:editCar      car="#{vehicle}"  rendered="#{test vehicle to see if it is a car}"/>
  <app:editPlane  plane="#{vehicle}"  rendered="#{test vehicle to see if it is a plane}"/>
</ui:repeat>

これは、適切なOO設計に対する侮辱のように思われます。これは、車両自体が、それを調べて自分自身を決定するビューではなく、何らかの形で正しいビューの選択に参加する必要があることを示しているようです。このパターンは、クラスまたはそのサブクラスのインスタンスである必要があるオブジェクトに半異種のコレクションまたはプロパティがあるコードの多くの場所で見られます。また、何ができるかを公開する特別なエディターが必要です。サブクラスが異なります。匂いのようですが、もっと良い方法があるかどうか聞いてみようと思いました。

4

1 に答える 1

0

一般に、車両をラップし、その特定の車両タイプを編集するために含めるxhtmlファイルを提供する(または必要に応じて規則を使用する)バッキングBeanに何かを含める必要があります。そうすれば、jsfファイルに特定のものは何もありません。ui:includeを使用して、車両バッキングBeanのプロパティを呼び出すだけです。

于 2012-05-17T02:43:03.693 に答える