Android プロジェクトで冗長なコードを削減しようとしています。私がすでに持っているものをお話ししましょう。
2 つの主要なビュー グループがあります。1 つは MapView と呼ばれ、ズームやパンなどを行うことができるビットマップを含むビューです。もう 1 つは StepInfoView と呼ばれ、座標の配列やそれらの座標に関する情報などの静的データを含むビューです。このビューも、MapView と同じ方法でズームおよびパンされますが、スケール ファクターとパンされる量は、MapView から独立している必要があります。
StepInfoView はいくつかの異なるクラス (合計 6 つ) によって拡張されており、それらはすべて同期する必要があります (座標は 1 つにプロットされ、座標間の線は別のクラスにプロットされるなど)。
したがって、現在、私のコードの要点は次のとおりです。
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 の両方にスケールがありますが、MapView スケールは StepInfoView から独立している必要があるため、RootView でスケールを静的にすることはできません。これがうまくいくとわかっている解決策ですが、ゲッターとセッターの混乱は好きではありません。
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 の「スケール」変数)。
私ができることは、RootView で非静的スケールを宣言し、それを StepInfoView で静的として「キャスト」することです。それは正確には不可能です...
手伝ってもらえますか?