使两个子视图中的对象相等

问题描述 投票:0回答:2

我有两个视图类,HitOrMissPlaceShips,它们扩展了一个类BuildGame。 BuildGame有一个对象mGame。在运行时,创建了2个mGame实例,每个子类一个。 mGame包含一个监听器列表,但是HitOrMiss和PlaceShips只将他们的监听器添加到他们自己的mGame实例中。因此,只有在您点击该特定视图时,才会更新各个视图。

本质上我试图将其中一个视图的mGame设置为另一个的mGame,这样只会更新对同一个对象的引用,但我无法弄清楚如何!将mGame设置为static确实有效,但是,我的这个部门的讲师说有另一种方法没有使用静态而且我会丢失标记,这是公平的。

BuildGame:

public class BuildGame extends View {
protected final BaseSubClass mGame = new BaseSubClass(10, 10, BattleshipGameBase.ShipData.CREATOR.newArray(5));
private Paint mGridPaint, mPlayer1Paint, mPlayer2Paint, mBGPaint, mHitPaint, mMissPaint;
protected float diameterX, diameterY, chosenDiameter, separatorSize, canvasWidth, canvasHeight;
protected int tokenAtPos;

public BuildGame(Context context, AttributeSet attrs) {
    super(context, attrs);
    initialise();
}

除了名称之外,PlacedShips和HitOrMiss基本上是相同的片段:

public class PlaceShips extends BuildGame {

private GestureDetector mGestureDetector;
private int placedShipNo = 0;

public PlaceShips(Context context, AttributeSet attrs) {
    super(context, attrs);
    mGestureDetector = new GestureDetector(context, new MyGestureListener());

    //GameplayListenerStuff
    BattleshipGameBase.BattleshipGameListener mGameplayListenerPS = new BattleshipGameBase.BattleshipGameListener() {
        @Override
        public void onGameChanged(BattleshipGameBase game, int column, int row) {
            System.out.println("onGameChangedPS");
            invalidate();
        }
    };
    mGame.addOnGameChangeListener(mGameplayListenerPS);
}
java android
2个回答
0
投票

我知道你想在你的mgamePlaceShips对象中使用相同的HitOrMiss对象吗?

你可以这样做:BuildGame

public class BuildGame extends View {
    protected final BaseSubClass mGame;
    //...

    public BuildGame(Context context, AttributeSet attrs, BaseSubClass mGame) {
        super(context, attrs);
        this.mGame = mGame;
        initialise();
    }
}

PlaceShips和类似的HitOrMiss

public class PlaceShips extends BuildGame {
    //...

    public PlaceShips(Context context, AttributeSet attrs, BaseSubClass mGame) {
        super(context, attrs, mGame);
        mGestureDetector = new GestureDetector(context, new MyGestureListener());

        //GameplayListenerStuff
        //...
        mGame.addOnGameChangeListener(mGameplayListenerPS);
    }
}

现在,当您创建一个新的PlaceShips对象或HitOrMiss对象时,您必须将BaseSubClass作为第三个参数。要在PlaceShips对象和HitOrMiss对象中具有相同的mGame:

//...
BaseSubClass mySharedObject = new BaseSubClass(10, 10, BattleshipGameBase.ShipData.CREATOR.newArray(5));
PlaceShips ships = new PlaceShips(getApplicationContext(), myAttributeSet1, mySharedObject);
HitOrMiss hitOrNo = new HitOrMiss(getApplicationContext(), myAttributeSet2, mySharedObject);
//...

0
投票

事实证明,使用mGame的setter和getter方法是答案,并在活动中将HitOrMiss的mGame设置为PlacedShips的mGame。在任何一个子类中执行它都不起作用。

事实证明,我创建听众的方式是错误的,这没有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.