将不同子类的二维列表存储并获取到Google Firebase



我一直在为我的班级项目构建一个多人棋盘游戏。下面的代码在Room类中,因为每个游戏都应该有一个棋盘。

我转换为2D列表是因为Firebase不序列化数组。

列表中存储的每个对象都是Checker的一个子类,包括nullc(null的替代品(。我之所以在列表中存储nullc,是因为列表中有两行只有nulls,而Firebase不存储这两行的索引。

this.checkerList = new ArrayList<List<Checker>>();
Checker nullc = new NullChecker();
Checker [][] checkerArray = new Checker[][]
    {{nullc, new RedChecker(0,1), nullc, new RedChecker(0,3),
      nullc, new RedChecker(0,5), nullc, new RedChecker(0,7)},
      {new RedChecker(1,0), nullc, new RedChecker(1,2),nullc, new RedChecker(1,4), nullc, new RedChecker(1,6), nullc},
      {nullc, new RedChecker(2,1), nullc, new RedChecker(2,3), nullc, new RedChecker(2,5), nullc, new RedChecker(2,7)},
      {nullc, nullc, nullc, nullc,nullc, nullc,nullc, nullc},
      {nullc, nullc, nullc, nullc,nullc, nullc,nullc, nullc},
      {new BlackChecker(5,0), nullc, new BlackChecker(5,2),nullc, new BlackChecker(5,4), nullc, new BlackChecker(5,6), nullc},
      {nullc, new BlackChecker(6,1), nullc, new BlackChecker(6,3), nullc, new BlackChecker(6,5), nullc, new BlackChecker(6,7)},
      {new BlackChecker(7,0), nullc, new BlackChecker(7,2),nullc, new BlackChecker(7,4), nullc, new BlackChecker(7,6), nullc}};
for(int r = 0; r < checkerArray.length; r++){
    List <Checker> row = new ArrayList <Checker>();
    for(int c = 0; c < checkerArray[r].length; c++){
        row.add(checkerArray[r][c]);
    }
    this.checkerList.add(row);
}

我现在遇到的问题是该列表在Firebase数据库中存储良好。然而,当我从数据库中检索整个列表时,子类不再是子类

    refThisRoom.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if(dataSnapshot.getValue(Room.class).getPlayer2() != null){
                turn = dataSnapshot.getValue(Room.class).getTurn();
                checkerList = dataSnapshot.getValue(Room.class).getCheckerList();
                for(int r = 0; r < checkerList.size(); r++){
                    Log.d("checkerList", "row" + String.valueOf(r));
                    Log.d("checkerList", "rowSize" + String.valueOf(checkerList.size()));
                    for(int c = 0; c < checkerList.get(r).size(); c++){
                        Log.d("checkerList", "Column" + String.valueOf(c));
                        Log.d("checkerList", "ColumnSize" + String.valueOf(checkerList.get(r).size()));
                        Log.d("checkerList","hello: "+checkerList.get(r).get(c).getClass().getSimpleName());
                    }
                }
                Toast.makeText(BlackCheckerActivity.this,"Player Entered",Toast.LENGTH_LONG).show();
                updateAllButtons();
                disableButtons();
            }
            else{
                Toast.makeText(BlackCheckerActivity.this,"Waiting for another player",Toast.LENGTH_LONG).show();
            }
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
        }
    });

它不是返回BlackChecker、RedChecker和NullChecker,而是返回checker。我现在被卡住了,因为我正在使用instanceof来确定每个检查器的移动。

我通过在构造函数的父类中添加另一个名为"type"的类型字符串字段来解决这个问题。对于子类,当我创建一个子类时,我写了

     new RedChecker(row, column, "RedChecker")
     new BlackChecker(row, column, "BlackerChecker")
     new NullChecker(row, column, "NullChecker").

当检索Checker类的列表时,我用新启动的子类替换了对象中的所有超类。类似的东西

    if(checkerList.get(r).get(c).getType().equals("Red/Black/NullChecker")){
      checkerList.get(r).set(c, new Red/Black/NullChecker(checkerList.get(r).get(c).getRow(), checkerList.get(r).get(c).getColumn(), checkerList.get(r).get(c).getType())
    }

最新更新