继承的静态变量
Inherited Static Variables
我正在尝试通过继承实现一个简单的国际象棋问题,但我发现自己卡住了。
我有我的抽象棋子 class 和许多子棋子 class 每种棋子类型。我需要一个数组来存储每块可能的移动,所以我正在考虑将变量设为静态,因为这个数组总是相同的并且独立于实例
public class Knight extends Chesspiece{
public static final int dy = {1, 1, 2, 2, -1, -1, -2, -2};
public static final int dx = {2, -2, 1, -1, 2, -2, 1, -1};
}
有点像这样,但后来在我的逻辑中我只有实例而不知道它的子类型,所以我无法访问这个变量。
我想也许我可以以某种方式在我的 Chesspiece class 中声明一个抽象变量或其他东西,然后在每个子 class 中覆盖它的值。但是在搜索之后我发现 java 不允许静态继承。
所以我想知道解决这个问题的最佳方法是什么。我非常热衷于学习好的概念编程,所以每次我都写出更好的代码。我虽然有可行的解决方案(不是使变量成为静态变量),但对于这个问题,它们似乎不正确或不优雅。感谢任何帮助。
I thought maybe i could somehow declare an abstract variable or something in my Chesspiece class, and then overwrite its value in each subclass. But after searching i found out that java doesn't let static inheritance.
这里有几处需要更正:
- 首先,你不能有抽象变量(我假设你指的是字段)。字段不参与继承,因此不能在一个 class 中声明,然后在另一个中“实现”。
- 其次,静态和抽象不能放在一起。它们是完全不同的东西。所以,这个语句是一个non-sequitur.
正确的做法是将抽象方法添加到基础class或接口。例如,假设您的 Chesspiece
class 是抽象的,请在此处添加:
abstract class Chesspiece {
// ...
abstract int[] getDx();
abstract int[] getDy();
// ...
}
现在,扩展 Chesspiece
的 non-abstract class 必须提供实现:
class Knight extends Chesspiece{
private static final int dy = {1, 1, 2, 2, -1, -1, -2, -2};
private static final int dx = {2, -2, 1, -1, 2, -2, 1, -1};
@Override int[] getDy() { return dy; }
@Override int[] getDx() { return dx; }
}
如果您这样做,每次都会 return 编辑相同的数组实例。然而,这不一定是可取的,因为它允许更改 Knight
个实例的内部状态:
Knight robin = new Knight();
System.out.println(robin.getDx()[0]); // 2
Knight galahad = new Knight();
galahad.getDx()[0] = 42;
System.out.println(galahad.getDx()[0]); // 42.
System.out.println(robin.getDx()[0]); // 42 !?
为了解决这个问题,不要每次都 return 相同的实例:要么在 getter:
中声明数组
@Override int[] getDx() {
return new int[] {2, -2, 1, -1, 2, -2, 1, -1};
}
Knight robin = new Knight();
System.out.println(robin.getDx()[0]); // 2
Knight galahad = new Knight();
galahad.getDx()[0] = 42;
System.out.println(galahad.getDx()[0]); // 2
System.out.println(robin.getDx()[0]); // 2
或者,复制 getter 中的数组:
@Override int[] getDx() {
return Arrays.copyOf(dx, dx.length);
}
我正在尝试通过继承实现一个简单的国际象棋问题,但我发现自己卡住了。
我有我的抽象棋子 class 和许多子棋子 class 每种棋子类型。我需要一个数组来存储每块可能的移动,所以我正在考虑将变量设为静态,因为这个数组总是相同的并且独立于实例
public class Knight extends Chesspiece{
public static final int dy = {1, 1, 2, 2, -1, -1, -2, -2};
public static final int dx = {2, -2, 1, -1, 2, -2, 1, -1};
}
有点像这样,但后来在我的逻辑中我只有实例而不知道它的子类型,所以我无法访问这个变量。
我想也许我可以以某种方式在我的 Chesspiece class 中声明一个抽象变量或其他东西,然后在每个子 class 中覆盖它的值。但是在搜索之后我发现 java 不允许静态继承。
所以我想知道解决这个问题的最佳方法是什么。我非常热衷于学习好的概念编程,所以每次我都写出更好的代码。我虽然有可行的解决方案(不是使变量成为静态变量),但对于这个问题,它们似乎不正确或不优雅。感谢任何帮助。
I thought maybe i could somehow declare an abstract variable or something in my Chesspiece class, and then overwrite its value in each subclass. But after searching i found out that java doesn't let static inheritance.
这里有几处需要更正:
- 首先,你不能有抽象变量(我假设你指的是字段)。字段不参与继承,因此不能在一个 class 中声明,然后在另一个中“实现”。
- 其次,静态和抽象不能放在一起。它们是完全不同的东西。所以,这个语句是一个non-sequitur.
正确的做法是将抽象方法添加到基础class或接口。例如,假设您的 Chesspiece
class 是抽象的,请在此处添加:
abstract class Chesspiece {
// ...
abstract int[] getDx();
abstract int[] getDy();
// ...
}
现在,扩展 Chesspiece
的 non-abstract class 必须提供实现:
class Knight extends Chesspiece{
private static final int dy = {1, 1, 2, 2, -1, -1, -2, -2};
private static final int dx = {2, -2, 1, -1, 2, -2, 1, -1};
@Override int[] getDy() { return dy; }
@Override int[] getDx() { return dx; }
}
如果您这样做,每次都会 return 编辑相同的数组实例。然而,这不一定是可取的,因为它允许更改 Knight
个实例的内部状态:
Knight robin = new Knight();
System.out.println(robin.getDx()[0]); // 2
Knight galahad = new Knight();
galahad.getDx()[0] = 42;
System.out.println(galahad.getDx()[0]); // 42.
System.out.println(robin.getDx()[0]); // 42 !?
为了解决这个问题,不要每次都 return 相同的实例:要么在 getter:
中声明数组 @Override int[] getDx() {
return new int[] {2, -2, 1, -1, 2, -2, 1, -1};
}
Knight robin = new Knight();
System.out.println(robin.getDx()[0]); // 2
Knight galahad = new Knight();
galahad.getDx()[0] = 42;
System.out.println(galahad.getDx()[0]); // 2
System.out.println(robin.getDx()[0]); // 2
或者,复制 getter 中的数组:
@Override int[] getDx() {
return Arrays.copyOf(dx, dx.length);
}