Java继承:抽象类中的“Casting”变量为static

时间:2012-08-03 11:31:08

标签: java inheritance static abstract

我正在寻求减少Android项目中的冗余代码。让我告诉你我已有的东西。

我有两组主要观点。一个称为MapView,它是一个包含可以缩放,平移等位图的视图。另一个称为StepInfoView,它是一个包含静态数据的视图,例如坐标数组和有关这些坐标的信息。此视图也以与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。这是一个我知道可行的解决方案,但我不喜欢吸气剂和制定者的混乱:

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
}

这完全适用于我希望它如何工作,但是再一次,有相同的代码(getter和setter以及MapView和StepInfoView中的“scale”变量)。

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

你能帮助我吗?

3 个答案:

答案 0 :(得分:1)

浮动花费大约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);
    }

答案 1 :(得分:0)

为什么不将scale字段移到RootView类?

更新:刚刚搞定了。我认为有一个聚合的地方:为stepinfo scale创建一些对象容器,并通过StepInfoView传递。

无论如何,我认为使用getter是最简单的方式。

答案 2 :(得分:0)

将scale字段移动到侦听器,并提供get和set。

在视图中,保留对侦听器的引用,以便您可以访问该比例。

对于MapView,为每个视图实例注册一个不同的侦听器,以便它们具有不同的比例。

对于StepInfoView,为每个视图实例注册相同的侦听器,以使它们具有相同的比例。您可以将侦听器的引用存储在静态字段中。