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

时间:2013-11-21 09:57:52

标签: java static subclass final protected

有时我需要超类中的属性(例如ChessFigure),它应强制子类(例如PawnBishop)实现const(final)属性。例如,每个Chess图都有自己的Image,但它是static(但对于子类只是静态的,所以我不能在超类中使用它作为静态)和final

我怎样才能以专业的方式在超类ChessFigure中实现这个?

3 个答案:

答案 0 :(得分:1)

您无法强制子类声明变量,而与其的访问修饰符无关(例如,public,protected,private)。

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

此外,您可能还希望将来更改您的实现,比如使用属性文件来定义国际象棋图像的图像,而不是代码中的硬编码常量。使用封装用于查找正确图像的逻辑的方法(返回常量,读取属性文件等)将有助于代码的演变和维护。

答案 1 :(得分:1)

您的设计很复杂。更好的解决方案是

enum ChessFigure {
  KING, QUEEN, ROOKS, KNIGHTS, BISHOPS, PAWNS;
  Image blackImage, whiteImage; // to be filled
}

如果在enum的构造函数中初始化图像变量,则可以声明它们为final

或者,如果您想将逻辑与演示分开:

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

...

// within presentational code:
EnumMap<ChessFigure,Image> blackFigureImages;
EnumMap<ChessFigure,Image> whiteFigureImages;

如果您正在考虑可变数字,例如为了保持董事会的位置,使用可以使用不同的类,例如

class BoardFigure {
  final ChessFigure type;
  int row, column;
}

答案 2 :(得分:0)

您可能想要一个只读属性。 final不是实现这一目标的唯一方法。在我的示例中,非常类可以获取图像的路径,但只有子类和包中的类可以更改路径。

public abstract class ChessFigure {
   private static String imagePath;

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

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