我有一个基类PlanItem,所有其他子类都可以扩展。
捕获:
我本可以一字不差地完成4个完全克隆的课程,但这会让编辑变得非常痛苦。我选择使用继承,但后来出现了循环依赖的问题。
目前我:
让基础PlanItem类有一个字段:
private ObservableList<? extends PlanItem> childPlanItems = FXCollections
.observableArrayList();
我有一个带有Controller的FXML,ViewPlanItemController,它在TableView中显示特定项目的统计数据和子列表。
public class ViewChildItemsController<E extends PlanItem> {}
TableView具有添加,编辑,查看和删除子项的选项。
如果我想查看子项,那么我们递归加载带控制器的另一个ViewPlanItem.fxml。问题是,每次我想加载另一个ViewChildItem.fxml时,我都需要为它提供子类型,以便它可以查看它们。
如果我试图查看一个目标,我会初始化控制器,以便它知道显示策略类型的项目。
如果需要,这是控制器的init方法:
/**
* Initializes the values of the items to be displayed.
*
* @param list The list of child items to display.
* @param defCtor Default ctor of each child item.
* @param copyCtor Copy ctor of each child item.
*/
public void initValues(ObservableList<E> list, Supplier<E> defCtor, UnaryOperator<E> copyCtor) {
childItemsTableView.setItems(list);
statisticsPanelController.init(list);
this.defCtor = defCtor;
this.copyCtor = copyCtor;
}
我该怎么做?如果我在ViewPlanItemController类本身内,我如何知道子项的类类型?看来它来自Objective-&gt; Strategy-&gt; Tactic-&gt; Task,需要有一些类级别的递归。
答案 0 :(得分:2)
由于Task
实例不(不应该)具有子项,因此将子列表放在其超类中是没有意义的。将它放在不同的类中可能会更好,也许是:
abstract class ParentPlanItem <E extends PlanItem> extends PlanItem {
// Moved here from PlanItem:
private ObservableList<E> childPlanItems = FXCollections.observableArrayList();
// You might also need these:
private Supplier<E> childConstructor;
private unaryOperator<E> childCopyConstructor;
}
那可以是Objective
,Strategy
和Tactic
的超类。它有足够的信息来正确调用控制器的init方法。获得childConstructor
和childCopyConstructor
值的地方是一个单独的问题。我可能会考虑将它们作为相关类的最终静态字段,但是各个类构造函数仍然需要设置它们。大概。你可能会更聪明。