2013-03-05 8 views
5
private class HSV extends HorizontalScrollView { 
    public LinearLayout L; 
    public AbsoluteLayout A; 
    public HSV(Context context) { 
     super(context); 
     L = new LinearLayout(context); 
     A = new AbsoluteLayout(context); 
    } 
    @Override public void addView(View child) { 
     A.addView(child); 
    } 
    void update_scroll() { 
     removeView(L); 
     addView(L, 0); 
     L.removeView(A); 
     L.addView(A); 
     A.invalidate(); 
     L.invalidate(); 
     invalidate(); 
     requestLayout(); 
    } 
    int GetCurrentPos() { 
     return getScrollX(); // <-- this line if HSV 
     return getScrollY(); // <-- this line if VSV 
    } 
    ... few more methods skipped, they will not change at all in 'vertical' version 
} 

私はこのクラスを持っています。今私は(垂直)ScrollViewから派生し、まったく同じ新しいクラスのVSVが必要です。私は確かにちょうど確かにそれ、(L、0)(L、0) SO上で公開するとき(おっと、これは間違いだったにHorizo​​ntalScrolViewを拡張するにはScrollViewを拡張して、ブロック全体をコピーして、を変更することができます行は変わらない、GetCurrentPosは)。java sugaring、ここではほぼ同じコードを避けることはできますか?

または "bool vertical"プロパティを追加できます。しかし、Javaにはテンプレートやマクロ、ランタイムプロトタイピングがありません。この例では、コードの重複を避けるためにJavaに他の方法がありますか? android.widget.ScrollViewandroid.widget.HorizontalScrollViewのドキュメントを見てみると

+1

共通の基本クラスを持ち、垂直クラスと水平クラスを導出します。コンストラクタのパラメータの向き(スイング)またはオーバーライドを使用します。 –

+1

HSVからVSVクラスを派生させる場合。単純にaddViewメソッドを空のメソッドでオーバーライドすることができます。たぶん、他のメソッドに最初に抽出して、それをオーバーライドする必要があります。 –

+2

私はこれら2つのクラスにとどまります。それらをマージしようとすると、コードをより複雑にしてデバッグするのが難しくなります。そして、これについて考える時は、あなたが保存しているコードのほんの些細な行の価値がありません。 – Kai

答えて

2

、それらの両方は、だから私はここに何が不足しておりません場合は、コードの行を変更する必要はないでしょう

void addView(View child, int index) 

を実装するように見えること。また、両方のクラスはandroid.view.ViewGroupからこのメソッドを継承します。だから、両方のクラスの実装が同じであれば、あなたはこの

public abstract class ScrollViewDelegate<T extends FrameLayout> { 
    private final T view; 
    private LinearLayout L; 
    private AbsoluteLayout A; 

    public ScrollViewWrapper(T view) { 
    this.view = view; 
    L = new LinearLayout(view.getContext()); // or pass as parameter 
    A = new AbsoluteLayout(view.getContext()); // or pass as parameter 
    } 

    void update_scroll() { 
     view.removeView(L); 
     view.addView(L, 0); 
     L.removeView(A); 
     L.addView(A); 
     A.invalidate(); 
     L.invalidate(); 
     view.invalidate(); 
     view.requestLayout(); 
    } 
    // ... 
} 

のような何かができると(必要な場合)HSV/VSVに、あなたは、このクラスに委譲することができます。

public class HSV extends HorizontalScrollView { 

    private final ScrollViewDelegate<HorizontalScrollView> delegate; 

    public HSV(Context context) { 
     super(context); 
     this.delegate = new ScrollViewDelegate<HorizontalScrollView>(this); 
    } 
    // do stuff with this.delegate 
} 

public class VSV extends ScrollView { 

    private final ScrollViewDelegate<ScrollView> delegate; 

    public VSV(Context context) { 
     super(context); 
     this.delegate = new ScrollViewDelegate<ScrollView>(this); 
    } 
} 
+0

しかし、のことは何ですか? C++テンプレートのように見えますが、私はそれらの<>とTを意味します。しかし、 "Javaにはテンプレートサポートがありません"というのはどうですか? – exebook

+1

Javaにはいくつかのバージョンのジェネリッククラスがありました.C++のテンプレートと似ていて、 'LinkedList <>'は 'LinkedList 'や 'LinkedList 'と同じで、C++のテンプレートコレクションのようです。 – Patashu

+0

Javaジェネリックがほぼ10年。 – jahroy

関連する問題