我怎样才能从超类中扩展东西? (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,如果需要)覆盖该方法并将其用作对象组合的成员变量.