2013-03-05 50 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 
} 

我有這門課,它完全符合我的要求。現在我需要新的類VSV,它將從(垂直)ScrollView派生出來,並且是一樣的。我當然可以複製整個街區,並更改延伸Horizo​​ntalScrolView延伸滾動型,然後(L,0)(0,L)(哎呀,這是一個錯誤SO發佈的時候,肯定有行不會改變,GetCurrentPos會)。java糖,我可以在這裏避免幾乎重複的代碼?

或者我可以添加「bool vertical」屬性。但是Java沒有模板或宏,也沒有運行時原型,那麼Java中有沒有其他方法可以避免代碼重複?

+1

有一個共同的基類,並派生一個垂直類和一個水平類。可以使用構造器參數方向(àla swing)或覆蓋。 – 2013-03-05 11:18:49

+1

如果您從HSV派生VSV類。您可以簡單地使用空方法覆蓋addView方法。也許你應該首先將其提取到其他方法,然後重寫它。 – 2013-03-05 11:19:28

+2

我會留在這兩個班。嘗試合併它們時,您會使代碼更復雜,更難以調試。而思考這個問題的時間不值得你節省的少量代碼。 – Kai 2013-03-05 11:28:32

回答

2

看爲android.widget.ScrollViewandroid.widget.HorizontalScrollView,文檔他們兩人似乎實現

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 2013-03-06 02:30:01

+1

Java現在已經有了幾個版本的泛型類,它們與C++的模板相似,因爲它可以是LinkedList 或LinkedList 就像C++的模板集合 – Patashu 2013-03-06 02:34:34

+0

Java泛型已經存在近10年。 – jahroy 2013-03-06 03:39:45