我有多个枚举,它们都实现了相同的接口AnimationSet,但是有一些更多的字段,比如filename,每个枚举必须实现完全相同的getFilename()。
interface AnimationSet{
String getPath();
String getFilename();
}
public enum HammerAnimationSet implements AnimationSet{
ONE("1"),
TWO("2"),
THREE("3"),
FOUR("4");
private static String path = "hammer/";
private String filename;
private HammerAnimationSet(String filename){
this.filename = filename;
}
public String getFilename(){
return filename;
}
}
public enum ShopAnimationSet implements AnimationSet{
HEART("heart"),
MANA("mana bottle"),
LUCK("clover");
private static String path = "shop/";
private String filename;
private ShopAnimationSet(String filename){
this.filename = filename;
}
public String getFilename(){
return filename;
}
}
编辑:我现在使用这些枚举填充List<List<List<Image>>>
,其中第一个列表对应枚举和一组动画,第二个列表包含组中的所有动画,第三个列表(带图像) )表示一个特定动画中的所有图像
稍后我可以从这个列表中获取外部图像。
现在我正在寻找一种简化/缩短此代码的方法(方法和字段都是相同的)。
我想过一个超类,但那是不可能的,因为枚举已经扩展了Enum。我还考虑过将枚举更改为类,但我想保留枚举值。我也想过一个抽象的界面,但我想到的是不可能的。
你能否帮助思考一种实现简化的方法。
答案 0 :(得分:2)
您可以考虑使用委托而不是继承:
public class AnimationSet {
private final String path, filename;
public AnimationSet(String path, String filename) {
this.path = path;
this.filename = filename;
}
public String getPath() {
return path;
}
public String getFilename(){
return filename;
}
}
public enum HammerAnimationSet {
ONE("1"),
TWO("2"),
THREE("3"),
FOUR("4");
final AnimationSet animationSet;
HammerAnimationSet(String filename) {
animationSet=new AnimationSet("hammer/", filename);
}
public AnimationSet getAnimationSet() {
return animationSet;
}
}
public enum ShopAnimationSet {
HEART("heart"),
MANA("mana bottle"),
LUCK("clover");
final AnimationSet animationSet;
private ShopAnimationSet(String filename){
animationSet=new AnimationSet("shop/", filename);
}
public AnimationSet getAnimationSet() {
return animationSet;
}
}
因此AnimationSet
的功能可以扩展,而无需调整任何enum
。