调用子构造函数在java中的父构造函数中交错

时间:2015-06-10 16:27:35

标签: java

我有很多孩子去基地,并计划增加更多。我很懒。子创建者设置超级构造函数所需的一些基本内容,反之亦然。我的问题的一个简单解决方案如下:

array = %w(id address work)
array.each do |a|
  define_method "#{a}_attachment_require_upload?" do
    !object.public_send("#{a}_attachment?")
  end
end

然而,在每个孩子身上调用super.finalSetup()都是非常麻烦的事情,如果我忘记它就会破坏它。那不好。我的问题很简单:有没有办法将其设置为父级。至于我的谷歌技能,我一直无法找到。希望你们知道我不知道的事情。

由于

3 个答案:

答案 0 :(得分:0)

这应该这样做。基本思想是覆盖子节点中的before和after方法,在父构造函数中,您只需运行它们并在其间进行一些初始化。当然,这并不能避免忘记调用父构造函数。

abstract class Parent {

    Parent(){
        doBefore();
        // some stuff
        doAfter();
    }

    abstract void doBefore();

    abstract void doAfter();


}

class Child extends Parent {

    Child(){
        super();
    }

    void doBefore(){
        // do before stuff
    }

    void doAfter(){
        // do after stuff
    }
}

在父级中使用abstract方法,您可以实现前/后过程的任何排列。

答案 1 :(得分:0)

这应该是你想要的,但正如已经提到的,它可以是not the best idea。如果超类中有无参数构造函数,则不需要在子类中显式调用父构造函数。

abstract class Parent {
    Parent() {
        /*some code*/
        childInit();
        finalSetup();
    }
    void finalSetup() {/*code that dependent on the fact that the child constructor has run*/}
    abstract void childInit();
}

class Child extends Parent {
    @Override
    void childInit() {
        /* the code you would put in child's constructor */
    }
}

答案 2 :(得分:0)

考虑工厂模式来创建扩展Parent的泛型类型。

public class Parent {
   public Parent(){/*some code*/}
   public void finalSetup(){/*code that dependent on the fact that the child constructor has run*/}

   public static <T extends Parent> T makeChild(Class <T> klass) {
        T child = null;
        try {
          child = klass.newInstance();
          child.finalSetup();
        } 
        catch (InstantiationException| IllegalAccessException ex) {
           // somthing went wrong
        }
        return child;
    }
}

并致电

Child child = Parent.makeChild(Child.class);

在以下情况下很有用:
+一个类无法预测它必须创建的对象类 +一个类希望其子类指定字段或它创建的对象 + classes将责任委托给几个辅助子类之一,并且您希望本地化哪个辅助子类是委托的知识