如何初始化超类构造函数所需的子类中的参数对象?

时间:2015-12-22 21:10:32

标签: java inheritance constructor superclass

所以,这可能听起来有点奇怪,但让我解释一下。我有一个需要多个参数的超类。一个这样的参数是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}}

3 个答案:

答案 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(),并在构造函数中调用此方法。子类(蝙蝠侠)必须实现这种方法。

优点是在构造对象后不需要调用额外的方法(如另一个答案所示)。

相关问题