【发布时间】:2012-08-03 11:31:08
【问题描述】:
我正在寻求减少我的 Android 项目中的冗余代码。让我告诉你我已经拥有的东西。
我有两个主要的观点。一个称为 MapView,它是一个包含可以缩放、平移等位图的 View。另一个称为 StepInfoView,它是一个包含静态数据的 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
}
如您所见,onScale 是相同的。我想创建一个抽象类来保存缩放功能,我们称之为 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
}
这正是我希望它工作的方式,但是再一次,有重复的相同代码(getter 和 setter 以及 MapView 和 StepInfoView 中的“比例”变量)。
我希望我能在 RootView 中声明一个非静态比例并在 StepInfoView 中将其“转换”为静态。这不太可能......
你能帮帮我吗?
【问题讨论】:
标签: java inheritance static abstract