Java - 为什么我不能采用超类数组并获取子类函数?

问题描述 投票:0回答:1

我正在尝试从头开始编写一个国际象棋程序。我有一个名为“Piece”的超类,以及所有单个棋子(Pawn、Bishop、Knight 等)的子类。我还有另一个类“Board”,它存储一个 Piece[][] 以及有关哪种类型的棋子所在位置的所有信息。 例如:

private Piece[][] board = new Piece[][]{
    {new Rook(-1, 7,0),new Knight(-1, 7, 1),new Bishop(-1, 0, 0),new Queen(-1,7,3),new King(-1,7,4),new Bishop(-1,7,5),new Knight(-1,7,6),new Rook(-1,7,7)},
    {new Pawn(-1,6,0),new Pawn(-1,6,1),new Pawn(-1,6,2),new Pawn(-1,6,3),new Pawn(-1,6,4),new Pawn(-1,6,5),new Pawn(-1,6,6),new Pawn(-1,6,7)},
    {null,null,null,null,null,null,null,null},
    {null,null,null,null,null,null,null,null},
    {null,null,null,null,null,null,null,null},
    {null,null,null,null,null,null,null,null},
    {new Piece(1,1,1,0),new Pawn(1,1,1),new Pawn(1,1,2),new Pawn(1,1,3),new Pawn(1,1,4),new Pawn(1,1,5),new Pawn(1,1,6),new Pawn(1,1,7)},
    {new Rook(1,0,0),new Knight(1,0,1),new Bishop(1,0,2),new Queen(1,0,3),new King(1,0,4),new Bishop(1,0,5),new Knight(1,0,6),new Rook(1,0,7)}};

片段的语法是 (int Color, int Rank, int File)。由于代码确定单件价值的方式,颜色是一个整数。 我确信有更好的方法来制作董事会,但我现在不想重构那部分代码。

我目前的问题在于检查动作有效性的功能。 Board 类负责处理适用于所有类的内容,但为了完成检查,它会调用棋子类中的函数 Valid(),该函数存储代码,用于检查是否允许给定的移动根据作品的运动规则。但是,当我尝试调用此方法时,它不会返回子类中的方法,而是尝试返回 Piece 类中的 valid() 方法,而不是返回相应类型的片段。

我正在重构我的代码,通过将特定于片段的信息保留在它们自己的类中,使其不依赖于比所需的更多的 if() 语句,但事实证明这比预期更无帮助。代码以前可以工作,我可以恢复到旧版本,但我想继续进行此重构,以减轻我未来的潜在工作量。

目前我的代码如下所示:

switch(board[7-rank][file].getType()){
      case 1: Pawn p = (Pawn)board[7-rank][file];return p.valid();
      case 2: Bishop b = (Bishop)board[7-rank][file];return b.valid();
      case 3: Knight n = (Knight)board[7-rank][file];return n.valid();
      case 4: Rook r = (Rook)board[7-rank][file];return r.valid();
      case 5: Queen q = (Queen)board[7-rank][file];return q.valid();
      case 6: King k = (King)board[7-rank][file];return k.valid();
      default: System.out.println("Data returned as Piece, returning false.");return false;
    }

作为参考, getType() 函数是一个超类方法,旨在返回表示该块的整数值。我觉得从我的命名方案中,哪个数字对应哪个部件是显而易见的。该函数按预期工作。 当前代码正在运行,直到运行前一段代码并返回

class Piece cannot be cast to class Pawn (Piece and Pawn are in unnamed module of loader com.sun.tools.javac.launcher.MemoryClassLoader @68b32e3e)

我也尝试过放弃选角,最终得到了类似的结果。 (类型不匹配,无法从棋子转换为棋子。)。

我相信问题在于我如何实例化板,因为我将其实例化为 Piece[][],但我不确定如何获得我想要的结果。

java multidimensional-array casting polymorphism classcastexception
1个回答
0
投票

参考这 2 个 SO 问题,看看是否能解决您的问题

  1. java.lang.ClassException:A 无法转换为 B
  2. Java 中的向下转型
© www.soinside.com 2019 - 2024. All rights reserved.