Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用重写方法添加特定组件的抽象类_Java_Oop_Design Patterns_Wicket - Fatal编程技术网

Java 使用重写方法添加特定组件的抽象类

Java 使用重写方法添加特定组件的抽象类,java,oop,design-patterns,wicket,Java,Oop,Design Patterns,Wicket,实现一些扩展抽象超类的类的最佳方法是什么,其中每个类总是添加一个组件,但组件可能不同 我定义了一个抽象类,它实现了拖放行为,并有一个组件来显示和编辑一些字段。具体组件不同,在某些情况下,字段可能为空,可能有多个字段,以此类推。 在抽象类中,我通过抽象getComponent()方法添加组件。子类提供自己的实现。 子类使用在构造函数中传递的不同字段或根据构造函数中提供的参数计算的不同字段 这些字段在超级构造函数调用中还不可用,因此无法在抽象类的构造时调用getComponent()方法。 一种解决

实现一些扩展抽象超类的类的最佳方法是什么,其中每个类总是添加一个组件,但组件可能不同

我定义了一个抽象类,它实现了拖放行为,并有一个组件来显示和编辑一些字段。具体组件不同,在某些情况下,字段可能为空,可能有多个字段,以此类推。 在抽象类中,我通过抽象getComponent()方法添加组件。子类提供自己的实现。 子类使用在构造函数中传递的不同字段或根据构造函数中提供的参数计算的不同字段

这些字段在超级构造函数调用中还不可用,因此无法在抽象类的构造时调用getComponent()方法。 一种解决方法是在onInitialize()中添加组件,或者让实现类来添加组件(或者不添加),但整个方法可能是反模式的

代码段:

       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;
  }
}
公共抽象类AbstractContainer扩展面板{
AbstractContainer(字符串markupId、IModel somemodels..)
{
超级(markupId);
此.setOutputMarkupId(true);
添加(新的DragDropBehavior(“结果”){
//一些东西
});
//无法执行此操作。请在此处添加(getComponent()
//实现使用尚未设置的字段
//然而在儿童班
}
抽象受保护的组件getComponent();
}
公共类MyPanel扩展了AbstractContainer{
IModel mySpecificFieldModel;
MyPanel(字符串标记ID、IModel somemodels、IModel mySpecificFieldModel)
{
超级(部分型号);
this.mySpecificFieldModel=mySpecificFieldModel;
}
受保护的组件getComponent()
{
组件组件=新的MyComponent(“id”,this.mySpecificFieldModel);
返回组件;
}
}
也许模式可以帮助您

调用可重写工厂方法是Wicket中的常见模式:

protected void onInitialize() {
    add(newContent("contentId"));
}

protected abstract Component newContent(String id);

定义抽象getComponent()方法是复合模式。但我不确定这是否是处理添加wicket组件的正确/最佳方法。