gpt4 book ai didi

Java继承: "Casting" variable in abstract class as static

转载 作者:行者123 更新时间:2023-12-01 15:14:42 24 4
gpt4 key购买 nike

我正在寻求减少 Android 项目中的冗余代码。让我告诉你我已经拥有了什么。

我主要有两类观点。一种称为 MapView,它是包含可以缩放、平移等的位图的 View 。另一种称为 StepInfoView,它是包含静态数据的 View ,例如坐标数组和有关这些坐标的信息。此 View 也以与 MapView 相同的方式缩放和平移,但是比例因子和平移量需要独立于 MapView。

StepInfoView 由几个不同的类(总共 6 个)扩展,所有这些类都需要同步(坐标绘制在一个类上,坐标之间的线绘制在另一个类上,等等)。

所以,这是我当前代码的要点:

public class MapView extends View
{
protected float scale = 1;

protected class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener
{
@Override
public boolean onScale(ScaleGestureDetector detector)
{
scale *= detector.getScaleFactor());
return true;
}

}

}
...

public class StepInfoView extends View
{
static protected float scale = 1;
protected class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener
{
@Override
public boolean onScale(ScaleGestureDetector detector)
{
scale *= detector.getScaleFactor());
return true;
}

}
}
...
public class StepView extends StepInfoView
{
// Custom onDraw, same scale as PathView
}
public class PathView extends StepInfoView
{
// Custom onDraw, same scale as StepView
}

如您所见,onScales相同。我想创建一个抽象类来保存缩放功能,我们称之为RootView。 MapView 和 StepInfoView 都有比例尺,但我无法在 RootView 中使比例尺静态,因为 MapView 比例尺必须独立于 StepInfoView。这是一个我知道可行的解决方案,但我不喜欢困惑的 getter 和 setter:

abstract class RootView extends View
{
abstract protected float getScale();

abstract protected void setScale(float s);
protected class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener
{
@Override
public boolean onScale(ScaleGestureDetector detector)
{
setScale(getScale() * detector.getScaleFactor());
return true;
}
}
}
...
public class MapView extends RootView
{
public float scale = 1;
protected float getScale(){
return scale;
}

protected void setScale(float s){
scale = s;
}
}

public class StepInfoView extends RootView
{
public static float scale = 1;
protected float getScale(){
return scale;
}

protected void setScale(float s){
scale = s;
}
}
public class StepView extends StepInfoView
{
// Custom onDraw, same scale as PathView
}
public class PathView extends StepInfoView
{
// Custom onDraw, same scale as StepView
}

这完全按照我希望的方式工作,但是再次出现重复的相同代码(MapView 和 StepInfoView 中的 getter 和 setter 以及“scale”变量)。

我希望我能做的是在 RootView 中声明一个非静态比例并在 StepInfoView 中将其“转换”为静态。这不太可能......

你能帮我吗?

最佳答案

一个 float 大约需要 4 个字节。拥有其他类将使用比这多得多的内存。由于对象通常是 8 字节对齐的,因此它甚至可能不会使对象变小。

如果您想避免复杂性,我会将该字段保留为非静态。

你可以有

class RootView {
protected final float[] scale;

RootView() {
scale = new float[] { 1.0f };
}

protected RootView(float[] scale) {
this.scale = scale;
}

public boolean onScale(ScaleGestureDetector detector) {
scale[0] *= detector.getScaleFactor();
return true;
}
}

class StepInfoView extends RootView {
static final float[] scale = { 1.0f };

StepInfoView() {
super(scale);
}

关于Java继承: "Casting" variable in abstract class as static,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11794862/

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