0

サブクラスsetValueAt(int row, int col, int value)のスーパークラスからメソッドを拡張したい。NumberBoardSudoku

数独では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);      
    }
  }
4

4 に答える 4

1

「値」が取り得る値の範囲を再定義するために、ここでオーバーライドを探していると思います。

以下に示すように、オーバーライドに行くことができます。

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 クラス (必要に応じてローカルの内部クラス) でメソッドをオーバーライドし、オブジェクト構成によってメンバー変数として使用することをお勧めします。

于 2016-12-15T19:17:55.807 に答える
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()その中に新しい実装セットを書き込むことによるオーバーライド。

于 2016-12-15T18:59:09.280 に答える
1

Sudoku では値は空または 1 ~ 9 ですが、スーパークラス NumberBoard では値が空または >= 0 の場合があります。サブクラス Sudoku で値を変更するにはどうすればよいですか?

エラー ケースを処理する独自の例外を作成できます。

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;
}
于 2016-12-15T19:08:07.180 に答える