创建名为 RubikRight 的 Rubik class 的子 class
Creating a child class of Rubik class called RubikRight
我有一个 Rubik class 具有以下内容:
public class Rubik{
private int[][][] grid;
protected Face[] cube;
protected Face up;
protected Face left;
protected Face front;
protected Face right;
protected Face down;
protected Face back;
private static String dots = "......";
private String output;
//Constructor
public Rubik(int[][][] grid){
int[][][] copy_grid = new int[6][3][3];
for (int k = 0; k < 6; k++){
for (int i = 0; i < 3; i++){
for (int j = 0; j < 3; j++)
copy_grid[k][i][j] = grid[k][i][j];
}
}
this.grid = copy_grid;
this.up = new Face(grid[0]);
this.left = new Face(grid[1]);
this.front = new Face(grid[2]);
this.right = new Face(grid[3]);
this.down = new Face(grid[4]);
this.back = new Face(grid[5]);
this.cube = new Face[]{this.up, this.left, this.front, this.right, this.down, this.back};
}
我正在尝试创建一个扩展 Rubik 的 RubikRight class,并且 RubikRight 的定位方式是原始 Rubik 的右面现在朝向前方。这就是我为 RubikRight 定义构造函数的方式:
public class RubikRight extends Rubik{
//Constructor
public RubikRight(int[][][] grid){
int[][][] copy_grid = new int[6][3][3];
for (int k = 0; k < 6; k++){
for (int i = 0; i < 3; i++){
for (int j = 0; j < 3; j++)
copy_grid[k][i][j] = grid[k][i][j];
}
}
this.grid = copy_grid;
this.up = new Face(grid[0]);
this.left = new Face(grid[2]);
this.front = new Face(grid[3]);
this.right = new Face(grid[5]);
this.down = new Face(grid[4]);
this.back = new Face(grid[1]);
this.cube = new Face[]{this.up, this.left, this.front, this.right, this.down, this.back};
}
但是,我收到错误
Constructor Rubik in class Rubik cannot be applied to the given type;
public RubikRight(int[][][] grid){
^
required: int[][][]
found: no arguments
reason: actual and formal argument lists differ in length
1 error
我可以知道为什么我似乎不能那样定义 RubikRight 吗?
您没有调用父 class 的构造函数。
你在这里可以做的是,在父 class 中重载构造函数。创建默认构造函数(无参数构造函数)并使其受保护。
public class Rubik{
...
protected Rubik() {
}
}
这应该可以解决您的问题。
每当您实例化子 class 对象时,都会隐式调用父 class 默认构造函数。因此,当您通过调用 new RubikRight(int[][][])
实例化 RubikRight
时,它会从 RubikRight 的构造函数内部隐式调用 super()
。因此错误:
required: int[][][] // what you have in Rubik class, note that you don't have the default constructor
found: no arguments // super(/* no argument */) called implicitly
要消除错误,您有两种选择:
- 从
RubikRight
构造函数显式调用 super(grid)
。
- 或者,在
Rubik
(基础)class. 中实现默认构造函数
我有一个 Rubik class 具有以下内容:
public class Rubik{
private int[][][] grid;
protected Face[] cube;
protected Face up;
protected Face left;
protected Face front;
protected Face right;
protected Face down;
protected Face back;
private static String dots = "......";
private String output;
//Constructor
public Rubik(int[][][] grid){
int[][][] copy_grid = new int[6][3][3];
for (int k = 0; k < 6; k++){
for (int i = 0; i < 3; i++){
for (int j = 0; j < 3; j++)
copy_grid[k][i][j] = grid[k][i][j];
}
}
this.grid = copy_grid;
this.up = new Face(grid[0]);
this.left = new Face(grid[1]);
this.front = new Face(grid[2]);
this.right = new Face(grid[3]);
this.down = new Face(grid[4]);
this.back = new Face(grid[5]);
this.cube = new Face[]{this.up, this.left, this.front, this.right, this.down, this.back};
}
我正在尝试创建一个扩展 Rubik 的 RubikRight class,并且 RubikRight 的定位方式是原始 Rubik 的右面现在朝向前方。这就是我为 RubikRight 定义构造函数的方式:
public class RubikRight extends Rubik{
//Constructor
public RubikRight(int[][][] grid){
int[][][] copy_grid = new int[6][3][3];
for (int k = 0; k < 6; k++){
for (int i = 0; i < 3; i++){
for (int j = 0; j < 3; j++)
copy_grid[k][i][j] = grid[k][i][j];
}
}
this.grid = copy_grid;
this.up = new Face(grid[0]);
this.left = new Face(grid[2]);
this.front = new Face(grid[3]);
this.right = new Face(grid[5]);
this.down = new Face(grid[4]);
this.back = new Face(grid[1]);
this.cube = new Face[]{this.up, this.left, this.front, this.right, this.down, this.back};
}
但是,我收到错误
Constructor Rubik in class Rubik cannot be applied to the given type;
public RubikRight(int[][][] grid){
^
required: int[][][]
found: no arguments
reason: actual and formal argument lists differ in length
1 error
我可以知道为什么我似乎不能那样定义 RubikRight 吗?
您没有调用父 class 的构造函数。
你在这里可以做的是,在父 class 中重载构造函数。创建默认构造函数(无参数构造函数)并使其受保护。
public class Rubik{
...
protected Rubik() {
}
}
这应该可以解决您的问题。
每当您实例化子 class 对象时,都会隐式调用父 class 默认构造函数。因此,当您通过调用 new RubikRight(int[][][])
实例化 RubikRight
时,它会从 RubikRight 的构造函数内部隐式调用 super()
。因此错误:
required: int[][][] // what you have in Rubik class, note that you don't have the default constructor
found: no arguments // super(/* no argument */) called implicitly
要消除错误,您有两种选择:
- 从
RubikRight
构造函数显式调用super(grid)
。 - 或者,在
Rubik
(基础)class. 中实现默认构造函数