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

Bu sınıfa sahibim, istediğimi mükemmel yapıyor. Şimdi (dikey) ScrollView'dan türeyen ve sadece aynı olacak yeni sınıf VSV'ye ihtiyacım var. Kesinlikle sadece bütün blok kopyalayıp scrollview uzanır için HorizontalScrolView uzanır değiştirebilir ve ardından (L, 0) için (0, L) (SO üzerinde yayınlarken ayy, bu bir hata, kesinlikle olmasıydı satır değişmeyecek, GetCurrentPos yapacak).java sugaring, neredeyse iki kopya koddan kaçınabilir miyim?

veya "bool vertical" özelliğini ekleyebilirim. Ancak Java'nın hiçbir şablonu veya makroları veya çalışma zamanı prototipleri yoktur, bu nedenle bu örnekte kod çoğaltmasını önlemek için Java'da başka herhangi bir yol var mı? android.widget.ScrollView ve android.widget.HorizontalScrollView, belgelerine baktığımızda

+1

Ortak bir temel sınıfa sahip olun ve bir dikey sınıfa ve bir yatay sınıfa sahip olun. Ya kurucu param oryantasyonu (à la swing) veya overriding ile. –

+1

VSV sınıfını HSV'den türetirseniz. AddView yöntemini boş bir yöntemle geçersiz kılabilirsiniz. Belki önce onu başka bir yönteme çıkarmalı ve sonra geçersiz kılmalısınız. –

+2

Bu iki sınıfta kalırdım. Kodunuzu daha karmaşık ve birleştirmeye çalışırken hata ayıklama yapacaksınız. Ve bunun hakkında düşünme zamanı, kaydettiğiniz birkaç önemsiz kod satırına değmez. – Kai

cevap

2

ikisi de

void addView(View child, int index) 

Yani burada bir şey eksik etmiyorsam, o kod satırını değiştirmek olmazdı uygulamak gibi görünüyor. Ayrıca, her iki sınıf da bu yöntemi android.view.ViewGroup'dan devralır. Yani her iki sınıfların uygulama aynı ise, bu

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(); 
    } 
    // ... 
} 

gibi bir şey yapabileceğini ve (gerekirse) HSV/VSV içinde bu sınıfa devredebilir.

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

Ama öğesini uzatır? C++ şablonuna benziyor, yani <> ve T'yi kastediyorum. Ama "Java'nın şablon desteği yok" nasıl? – exebook

+1

Java, C++ 'nın şablonlarına benzeyen C++' nın şablonlarına benzeyen bir C++ 's şablonuna benziyor.' LinkedList 'bir "LinkedList " veya bir "LinkedList " olabilir, tıpkı C++' nın templated koleksiyonları gibi – Patashu

+0

Java jenerikleri için var neredeyse 10 yıl. – jahroy