我想从子类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;
}