实现扩展抽象超类的一些类的最佳方法是什么,其中每个类总是添加一个组件,但组件可能不同?
我定义了一个实现拖放行为的抽象类,并有一个显示和编辑某个字段的组件。特定组件不同,在某些情况下,字段可能为空,可能有多个字段,依此类推。 在抽象类中,我通过抽象的getComponent()方法添加组件。子类提供自己的实现。 子类使用在构造函数中传递的不同字段,或者从构造函数中提供的参数计算。
这些字段在超级构造函数调用中尚不可用,因此在构造时不能在抽象类中调用getComponent()方法。 workaroud是在onInitialize()中添加Component,或者只是将它留给实现类来添加组件(或不是?)但是整个方法可能是反模式。
代码段:
public abstract class AbstractContainer extends Panel {
AbstractContainer( String markupId, IModel<> somemodels ..)
{
super( markupId );
this.setOutputMarkupId( true );
this.add( new DragDropBehavior( "result" ) {
//some stuff
});
// cannot do this.add(getComponent()) here
// implementations use fields that have not been set
// yet in child classes
}
abstract protected Component getComponent();
}
public class MyPanel extends AbstractContainer {
IModel mySpecificFieldModel;
MyPanel( String markupId, IModel<> somemodels, IModel mySpecificFieldModel)
{
super( somemodels );
this.mySpecificFieldModel=mySpecificFieldModel;
}
protected Component getComponent()
{
Component component = new MyComponent("id", this.mySpecificFieldModel);
return component;
}
}
答案 0 :(得分:0)
也许Composite模式可以帮助你
答案 1 :(得分:0)
让onInitialize()
调用可覆盖的工厂方法是Wicket中常见的模式:
protected void onInitialize() {
add(newContent("contentId"));
}
protected abstract Component newContent(String id);