所以,这可能听起来有点奇怪,但让我解释一下。我有一个需要多个参数的超类。一个这样的参数是BufferedImage
对象。现在很明显,要初始化子类中的这个BufferedImage
以用作参数,我需要使用try和catch块。我能做到的唯一方法是在构造函数中调用的子类的方法。问题是,super()
构造函数必须是子类构造函数中的第一件事。因此,在调用BufferedImage
之前,我无法调用该方法来初始化super()
。在我的子类构造函数中调用BufferedImage
之前,如何在将super()
对象用作参数之前正确初始化我的public class CombatEntity {
BufferedImage sprite;
public CombatEntity(String name, BufferedImage sprite) {
//do something
}
}
对象?
示例:超级/父级
public class Batman {
BufferedImage sprite;
Batman() {
super("Bruce Wayne", sprite); //sprite hasn't been properly initalized
}
void getSprite() { //I need to call this method before super in order to initalize my image
try {
File f = new File("Batman.png");
sprite = ImageIO.read(f);
}
catch(Exception e) {
//whatever
}
}
}
示例:子类
{{1}}
答案 0 :(得分:2)
做这样的事情:
在父类中创建普通构造函数,它接受name和sprite参数。按照JavaBeans规范生成getter和setter方法。
<强> CombatEntity:强>
onBackPressed()
在Batman(子)类中创建两个构造函数 - 一个没有参数,可用于在初始化精灵图像之前创建Batman对象,第二个类似于父构造函数。当您调用不带参数的构造函数时,它会调用父构造函数并将其参数设置为default。然后你可以执行 generateSpriteImage(String spriteImagePath)来从注入路径创建精灵图像。
<强>蝙蝠侠:强>
public class CombatEntity {
protected String name;
protected BufferedImage sprite;
public CombatEntity(String name, BufferedImage sprite) {
this.name = name;
this.sprite = sprite;
}
/*
* Getters and Setters
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public BufferedImage getSprite() {
return sprite;
}
public void setSprite(BufferedImage sprite) {
this.sprite = sprite;
}
}
希望这会对你有所帮助。
答案 1 :(得分:1)
解决此问题的唯一方法是在Batman构造函数中要求一个Image参数。这个问题并不少见,并且是遵守Javabeans模式的原因之一,其中每个类都有一个null构造函数以及getter和setter。
答案 2 :(得分:1)
您的CombatEntity
可以定义abstract
方法getSprite()
,并在构造函数中调用此方法。子类(蝙蝠侠)必须实现这种方法。
优点是在构造对象后不需要调用额外的方法(如另一个答案所示)。