2017-01-12 5 views
0

각 클래스는 항상 구성 요소를 추가하지만 구성 요소는 다를 수있는 추상 수퍼 클래스를 확장하는 일부 클래스를 구현하는 가장 좋은 방법은 무엇입니까?Override 메서드를 사용하여 특정 구성 요소를 추가하는 추상 클래스

나는 끌어서 놓기 동작을 구현하는 추상 클래스를 정의하고 일부 필드를 표시하고 편집하는 구성 요소가 있습니다. 특정 구성 요소가 다른 경우, 필드가 비어있을 수 있으며, 필드가 두 개 이상일 수 있습니다. 추상 클래스에서 나는 추상 getComponent() 메소드를 통해 컴포넌트를 추가한다. 서브 클래스는 독자적인 구현을 제공합니다. 하위 클래스는 생성자에서 전달되거나 생성자에서 제공되는 매개 변수에서 계산 된 여러 필드를 사용합니다.

이 필드는 superconstructor 호출에서 아직 사용할 수 없기 때문에 getComponent() 메소드는 추상 클래스에서 생성시 호출 할 수 없습니다. workaroud는 onInitialize()에 Component를 추가하거나 구성 요소를 추가하기 위해 구현 클래스에 남겨 두는 것입니다 (또는하지 않겠습니까?)하지만 전체 접근 방식이 anti-pattern 일 수 있습니다.

코드 :

 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() 전화를 데 도움이 될 수 있습니다 (추상 getComponent 정의

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

protected abstract Component newContent(String id); 
0

어쩌면 Composite 패턴은 당신이

+0

) 메서드는 복합 패턴입니다. 그러나 그것이 wicket 구성 요소를 추가하는 것을 처리하는 올바른/최선의 방법인지 나는 확실하지 않았다. – Ivana