2017-01-12 8 views
0

Каков наилучший способ реализации некоторых классов, которые расширяют абстрактный суперкласс, где каждый класс всегда добавляет компонент, но компоненты могут отличаться?Абстрактный класс с использованием метода переопределения с добавлением определенного компонента

Я определяю абстрактный класс, который реализует поведение перетаскивания и имеет компонент для отображения и редактирования некоторого поля. Конкретный компонент отличается, в некоторых случаях поле может быть пустым, может быть больше одного поля и т. Д. В абстрактном классе я добавляю компонент через абстрактный метод getComponent(). Подклассы обеспечивают собственную реализацию. В подклассах используются разные поля, которые передаются в конструкторе или вычисляются из параметров, предоставленных в конструкторе.

Эти поля еще не доступны в вызове суперконстриктора, поэтому метод getComponent() не может быть вызван во время построения абстрактного класса. Workaroud заключается в том, чтобы добавить компонент в 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; 
    } 
} 

ответ

0

Имея onInitialize() вызов переопределение фабричный метод является общей картины в калиткой:

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

protected abstract Component newContent(String id); 
0

возможно Composite модель может помочь вам

+0

Определение абстрактного GetComponent() метод представляет собой композитный шаблон. Но я не был уверен, что это правильный/лучший способ обработать добавление компонентов калитки. – Ivana

 Смежные вопросы

  • Нет связанных вопросов^_^