Каков наилучший способ реализации некоторых классов, которые расширяют абстрактный суперкласс, где каждый класс всегда добавляет компонент, но компоненты могут отличаться?Абстрактный класс с использованием метода переопределения с добавлением определенного компонента
Я определяю абстрактный класс, который реализует поведение перетаскивания и имеет компонент для отображения и редактирования некоторого поля. Конкретный компонент отличается, в некоторых случаях поле может быть пустым, может быть больше одного поля и т. Д. В абстрактном классе я добавляю компонент через абстрактный метод 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;
}
}
Определение абстрактного GetComponent() метод представляет собой композитный шаблон. Но я не был уверен, что это правильный/лучший способ обработать добавление компонентов калитки. – Ivana