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