如何从超类中扩展内容? (Java)的

时间:2016-12-15 18:49:40

标签: java inheritance acm-java-libraries

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

4 个答案:

答案 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类(如果需要,本地内部类)覆盖该方法并通过对象组合将其用作成员变量。