我想从子类setValueAt(int row, int col, int value)中的超类NumberBoard扩展方法Sudoku

在Sudoku中,value为空或1到9,但在超类NumberBoard中,该值可能为空或>= 0。如何在子类Sudoku中进行更改?

超类NumberBoard(我无法更改超类):

public class NumberBoard {

/** Value of an empty cell. */
public static final int EMPTY = -1;

/** The board's state. */
private int[][] board;

/**
 * Sets the value of the given cell.
 *
 * @param row
 *            the cell's row, starting at 0.
 * @param col
 *            the cell's column, starting at 0.
 * @param value
 *            the cell's value. Must be {@code >= 0} or {@link #EMPTY}.
 */
public void setValueAt(int row, int col, int value) {
    if (isInRange(row, col) && (value == EMPTY || value >= 0)) {
        board[row][col] = value;
    }
}


/**
 * Checks if the given coordinates identify a valid cell on the board.
 *
 * @param row
 *            the cell's row, starting at 0.
 * @param col
 *            the cell's column, starting at 0.
 * @return {@code true} if the coordinate is in range, {@code false}
 *          otherwise.
 */
protected final boolean isInRange(int row, int col) {
    return 0 <= row
            && row < board.length
            && 0 <= col
            && col < board[row].length;
  }
}


还有我的子类Sudoku的代码(不幸的是,毫无意义):

public class Sudoku extends NumberBoard {


public void setValueAt(int row, int col, int value) {
    super.setValueAt(row, col, value);
    }
  }

最佳答案

在Sudoku中,该值为空或1到9,但在超类中
  NumberBoard值可能为空或> =0。如何在我的值中进行更改
  数独的子类?


您可以创建自己的异常来处理错误情况:

public class IncorectValueException extends Exception{
  public IncorectValueException(){
    super();
  }
}


此外,在NumberBoard类中,如果要重新定义根据类检查有效数据的行为,则在setValueAt()方法中将执行太多的单一处理,这些处理应分组在特定的方法中:

`isInRange(row, col) && (value == EMPTY || value >= 0)`


可能是一种新方法:isAcceptableValue(int row, int col, int value)

更改 :

public void setValueAt(int row, int col, int value) throws IncorectValueException{
    if (isInRange(row, col) && (value == EMPTY || value >= 0)) {
        board[row][col] = value;
    }
}


至 :

public void setValueAt(int row, int col, int value) throws IncorectValueException{
    if (!isAcceptableValue(row, col)) {
       throw new IncorectValueException();
    }
      board[row][col] = value;
}

public boolean isAcceptableValue(int row, int col, int value){
   if(isInRange(row, col) && (value == EMPTY || value >= 0)){
     return true;
   }
   return false;
}


现在,Sudoku类可能是这样的:

public class Sudoku extends NumberBoard {
     ...
public boolean isAcceptableValue(int row, int col, int value){
   if(isInRange(row, col) && (value==EMPTY || (value >= 1 && value <= 9))) {
      return true;
    }
    return false;
}

09-10 15:07