我想从子类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);
}
}
答案 0 :(得分:1)
检查子类中的值,如
public class Sudoku extends NumberBoard {
public void setValueAt(int row, int col, int value) {
if(value <= 9 && value >= 1 ) {
super.setValueAt(row, col, value);
} else {
throw IllegalArgumentException ("value can be empty or between 1 & 9 (inclusive)")
}
}
}
在这里你可以接受null,因为int不允许空值。
答案 1 :(得分:1)
几次读完你的问题之后,我终于明白了你的想法。如果不想运行从超类继承的实现,可以override
方法:
public class Sudoku extends NumberBoard {
@Override
public void setValueAt(int row, int col, int value) {
//do not invoke super.setValueAt() here
//Write your new implementation here
}
}
通过在其中编写一组新的实现来覆盖setValueAt()
。
答案 2 :(得分:1)
在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;
}
答案 3 :(得分:1)
我认为您正在寻找覆盖此处,重新定义价值范围&#39;重视&#39;可以。
您可以进行覆盖,如下所示,
public class Sudoku extends NumberBoard {
@Override
public void setValueAt(int row, int col, int value) {
if (value > 0 && value <= 9) { // Considering EMPTY just means 0 as int is primitive
super.setValueAt(row, col, value);
} else {
throw new IllegalArgumentException("Value cannot be negative or greater than 9");
}
}
}
然而,更好的设计是,可能是一个单独的EnhancedNumberBoard类(如果需要,本地内部类)覆盖该方法并通过对象组合将其用作成员变量。