继承的静态变量

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);
    }