假设为了讨论,我有以下经典层次结构:
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 设计的侮辱,这似乎表明车辆本身应该以某种方式参与正确视图的选择,而不是视图检查它并自行决定。我在我的代码中的很多地方都看到了这种模式,其中我有一个半异构集合或一个对象上的一个属性,该对象必须是一个类或其子类之一的实例,我需要一个特殊的编辑器来公开什么使子类不同。好像有异味,想问问有没有更好的办法。