如何从Java的超类内部调用重写方法的超类实现?

赫达亚特·马迪普(Hedayat Mahdipour)

假设我有两个类SuperClassSubClass并且扩展了SuperClass,例如:

public abstract class SuperClass {
    private Object field1;

    protected SuperClass(Object obj) {
        setField1(obj);
    }

    public void setField1(Object obj) {
        // perform some check on obj and
        // then set field1 such that field1==obj
    }
}


public class SubClass extends SuperClass {
    public SubClass(Object obj) {
        super(obj);
    }

    @Override
    public void setField1(Object obj) {
        super.setField1(obj);
        // do some work that is necessary only when
        // field1 is set through SubClass.setField1()
    }
}

我需要的是,当我创建一个对象时SubClass,我需要SuperClass.setField1()SuperClass构造函数内部调用方法,而不是SubClass.setField1()但是使用上面的代码,SubClass.setField1()将调用引发a的方法NullPointerException,因为完成的工作是在SubClass.setField1()尚未为null的字段上执行的。

有什么方法可以SuperClass.setField1()‍‍‍SuperClass构造函数内部显式调用吗?

利诺

您可以将所述方法主体移至私有方法,然后将默认方法(该方法可能被子类覆盖)委托给前者。看这个例子

public abstract class SuperClass {

    private Object field1;

    protected SuperClass(Object obj){
        // call the safe implementation
        setField1Safe(obj);
    }


    public void setField1(Object obj){
        // just delegates
        setField1Safe(obj);
    }

    private void setField1Safe(Object obj){
        // perform some check on obj and
        // then set field1 such that field1==obj
    }
}

public class SubClass extends SuperClass{
     public SubClass(Object obj){
         super(obj);
     }

     @Override
     public void setField1(Object obj){
         super.setField1(obj);
         // do some work that is necessary only when
         // field1 is set through SubClass.setField1()
     }
}

这样子类仍然可以重写,setField1但是如果您确实依赖于实现,则可以调用私有setField1Safe方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章