有时我需要超类中的属性(例如ChessFigure
),它应强制子类(例如Pawn
或Bishop
)实现const(final
)属性。例如,每个Chess图都有自己的Image,但它是static
(但对于子类只是静态的,所以我不能在超类中使用它作为静态)和final
。
我怎样才能以专业的方式在超类ChessFigure中实现这个?
答案 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;
}
}