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

Ho questa classe, fa perfettamente quello che voglio. Ora ho bisogno di un nuovo VSV di classe che deriverà da ScrollView (verticale) e sarà lo stesso. Sono certamente posso solo copiare intero blocco e cambiarne estende HorizontalScrolView a estende ScrollView, e quindi (L, 0) a (0, L) (oops, questo è stato un errore durante la pubblicazione su SO, sicuramente quello la linea non cambierà, il GetCurrentPos lo farà).java sugaring, posso evitare il codice quasi duplicato qui?

oppure posso aggiungere la proprietà "bool vertical". Ma Java non ha modelli o macro, né prototipi di runtime, quindi c'è un altro modo in Java per evitare la duplicazione del codice in questo esempio?

+1

Avere una classe base comune e derivare una classe verticale e una classe orizzontale. O con l'orientamento del parametro costruttore (à la swing) o sovrascritto. –

+1

Se si ottiene la classe VSV da HSV. Puoi semplicemente sovrascrivere il metodo addView con un metodo vuoto. Forse dovresti estrarlo prima con un altro metodo e poi sostituirlo. –

+2

Sarei rimasto con quelle due classi. Renderà il tuo codice più complicato e più difficile da eseguire il debug nel tentativo di unirli. E il tempo di pensare a questo non vale le poche righe di codice che stai salvando. – Kai

risposta

2

Guardando la documentazione per android.widget.ScrollView e android.widget.HorizontalScrollView, entrambi sembrano implementare

void addView(View child, int index) 

Quindi non avrebbe dovuto cambiare quella riga di codice, se io non mi manca nulla qui. Inoltre, entrambe le classi ereditano questo metodo da android.view.ViewGroup. Quindi, se l'implementazione di entrambe le classi è lo stesso, si potrebbe fare qualcosa di simile

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

e in HSV/VSV è possibile delegare a questa classe (se necessario).

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

Ma che cos'è questa cosa ? Sembra modello C++, intendo quelli <> e T. Ma che ne dite di "Java non ha supporto per i modelli"? – exebook

+1

Java ha avuto classi generiche per diverse versioni ora, che sono simili ai template di C++ in quanto un 'LinkedList <>' può essere un 'LinkedList ' o un 'LinkedList ', proprio come le collezioni di modelli di C++ – Patashu

+0

I generici Java sono esistiti per quasi 10 anni. – jahroy