2017-01-12 13 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()電話を持つことができます:(抽象getComponentの定義

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

protected abstract Component newContent(String id); 
0

は多分Compositeパターンは、あなたが

+0

)メソッドは複合パターンです。しかし、ウィケットコンポーネントの追加を処理するのが正しいかどうかはわかりませんでした。 – Ivana

関連する問題