2013-03-05 44 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