我怎样才能从超类中扩展东西? (Java)
How can I expand things from a superclass? (Java)
我想在我的子类 Sudoku
中扩展超类 NumberBoard
的方法 setValueAt(int row, int col, int value)
。
在数独中,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);
}
}
检查子类中的值,例如
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 不允许 null 值。
看了几遍你的问题,终于明白你的意思了。如果不想运行继承父类的实现,可以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()
。
In Sudoku the value is empty or 1 to 9, but in the superclass
NumberBoard the value may be empty or >= 0. How can I change it in my
subclass Sudoku?
您可以创建自己的异常来处理错误情况:
public class IncorectValueException extends Exception{
public IncorectValueException(){
super();
}
}
此外,在NumberBoard
class中,在setValueAt()
方法中你执行了太多的单一处理,如果你想重新定义检查有效的行为,应该将这些处理分组到一个特定的方法中数据根据 class :
`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
class 可能是这样的:
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;
}
我认为您正在寻找覆盖,以重新定义 'value' 可以采用的值的范围。
您可以如下所示进行覆盖,
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 class(本地内部 class,如果需要)覆盖该方法并将其用作对象组合的成员变量.
我想在我的子类 Sudoku
中扩展超类 NumberBoard
的方法 setValueAt(int row, int col, int value)
。
在数独中,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);
}
}
检查子类中的值,例如
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 不允许 null 值。
看了几遍你的问题,终于明白你的意思了。如果不想运行继承父类的实现,可以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()
。
In Sudoku the value is empty or 1 to 9, but in the superclass NumberBoard the value may be empty or >= 0. How can I change it in my subclass Sudoku?
您可以创建自己的异常来处理错误情况:
public class IncorectValueException extends Exception{
public IncorectValueException(){
super();
}
}
此外,在NumberBoard
class中,在setValueAt()
方法中你执行了太多的单一处理,如果你想重新定义检查有效的行为,应该将这些处理分组到一个特定的方法中数据根据 class :
`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
class 可能是这样的:
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;
}
我认为您正在寻找覆盖,以重新定义 'value' 可以采用的值的范围。
您可以如下所示进行覆盖,
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 class(本地内部 class,如果需要)覆盖该方法并将其用作对象组合的成员变量.