Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 强制子类定义受保护的最终实例变量_Java_Static_Subclass_Final_Protected - Fatal编程技术网

Java 强制子类定义受保护的最终实例变量

Java 强制子类定义受保护的最终实例变量,java,static,subclass,final,protected,Java,Static,Subclass,Final,Protected,有时我需要超类中的一个属性(例如ChessFigure),它应该强制子类(例如Pawn或Bishop)实现const(final)属性。例如,每个象棋人物都有自己的图像,但它是静态的(但对于子类来说只是静态的,所以我不能在超类中将它作为静态的)和最终的 如何以专业的方式在超类ChessFigure中实现这一点?您可能需要只读属性最终版不是实现这一目标的唯一方法。在我的示例中,每个类都可以获得图像的路径,但只有包中的子类和类可以更改路径 public abstract class ChessFig

有时我需要超类中的一个属性(例如
ChessFigure
),它应该强制子类(例如
Pawn
Bishop
)实现const(
final
)属性。例如,每个象棋人物都有自己的图像,但它是
静态的
(但对于子类来说只是静态的,所以我不能在超类中将它作为静态的)和
最终的


如何以专业的方式在超类ChessFigure中实现这一点?

您可能需要只读属性<代码>最终版不是实现这一目标的唯一方法。在我的示例中,每个类都可以获得图像的路径,但只有包中的子类和类可以更改路径

public abstract class ChessFigure {
   private static String imagePath;

   protected static void setPath(String imagePath) {
      this.imagePath = imagePath;
   }

   public static String getPath() {
      return imagePath;
   }
}

您不能强制子类独立于其访问修饰符(例如,public、protected、private)声明变量

正如@vikingsteve提到的,最好的选择可能是使用一个抽象方法,每个子类根据其需要重写,可能引用子类定义的常量值


此外,您可能还希望在将来更改实现,例如使用属性文件来定义象棋图形的图像,而不是代码中的硬编码常量。使用一种封装逻辑的方法来查找正确的映像(返回常量、读取属性文件或其他任何内容)将有助于代码的发展和维护。

您正在使设计复杂化。更好的解决办法是

enum ChessFigure {
  KING, QUEEN, ROOKS, KNIGHTS, BISHOPS, PAWNS;
  Image blackImage, whiteImage; // to be filled
}
如果在枚举的构造函数中初始化图像变量,则可以声明它们为
final

或者,如果要将逻辑与表示分离:

enum ChessFigure {
  KING, QUEEN, ROOKS, KNIGHTS, BISHOPS, PAWNS
}


你有没有考虑过<代码>抽象>代码>吸引子,而不是字段(属性)?然后强制具体的子类来实现它。@vikingsteve是的,这是我当前的“解决方案”。但是通过这种方式,每个子类在设置它之后都有相同的imagePath。如果我调用chessfigureRay中每个元素的getImagePath,它将返回相同的imagePath。是的,这是我当前的解决方案。但丑陋的是,我必须在每个子类中为ImagePath(或Spritesheet位置)编写最终属性。它不像干法,因为吸气剂是一样的,最终的性质也是一样的。但这可能是最好的解决方案。如果您使用常量来引用这些图像,您还可以根据它们所代表的真实图像(例如,“PAWN_image”、“BISHOP_image”等)来命名这些常量变量,而不是对所有图像使用通用名称。
// within presentational code:
EnumMap<ChessFigure,Image> blackFigureImages;
EnumMap<ChessFigure,Image> whiteFigureImages;
class BoardFigure {
  final ChessFigure type;
  int row, column;
}