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 и быть таким же. Я, конечно, можно просто скопировать весь блок и изменить расширяет HorizontalScrolView к расширяет ScrollView, а затем (L, 0) в (0, L) (ой, это была ошибка при публикации на SO, конечно, что строка не изменится, GetCurrentPos будет).java sugaring, можно ли избежать почти дублирования кода здесь?
или я могу добавить свойство «bool vertical». Но у Java нет шаблонов или макросов или прототипов времени исполнения, так есть ли другой способ на Java, чтобы избежать дублирования кода в этом примере?
Имейте общий базовый класс и выведите вертикальный класс и горизонтальный класс. Либо с параметрической ориентацией конструктора (à la swing), либо переопределением. –
Если вы вывели VSV-класс из HSV. Вы можете просто переопределить метод addView пустым методом. Возможно, вам следует сначала извлечь его в другой метод, а затем переопределить. –
Я бы остался с этими двумя классами. Вы сделаете свой код более сложным и сложным для отладки при попытке объединить их. И время, думая об этом, не стоит нескольких простых чисел кода, которые вы сохраняете. – Kai