gpt4 book ai didi

java sugaring,我可以在这里避免几乎重复的代码吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:06:03 25 4
gpt4 key购买 nike

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
}

我有这个类(class),它完美地完成了我想要的。现在我需要新的类 VSV,它将派生自(垂直)ScrollView 并且是一样的。我当然可以复制整个 block 并将 extends Horizo​​ntalScrolView 更改为 extends ScrollView,然后将 (L, 0) 更改为 (0, L)(糟糕,这是在 SO 上发布时的一个错误,那行肯定不会改变,GetCurrentPos 会)。

或者我可以添加“bool vertical”属性。但是 Java 没有模板或宏,也没有运行时原型(prototype),那么 Java 中有没有其他方法可以避免此示例中的代码重复?

最佳答案

查看 android.widget.ScrollView 的文档和 android.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 中,您可以委托(delegate)给此类(如果需要)。

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);
}
}

关于java sugaring,我可以在这里避免几乎重复的代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15222285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com