当构造函数需要调用可覆盖的方法

时间:2017-03-23 07:51:30

标签: java oop constructor

根据this question,虽然我明白为什么会出错,但如何在保持代码干净的同时有效地解决这个问题呢?我不想将该函数中的内容复制并粘贴到构造函数中。

假设我有以下

class Parent
{
    Parent()
    {
        overridableFunction();
    }

    void overridableFunction()
    { ... }
}

class Child extends Parent
{
    Child()
    {
        super();
        overridableFunction()
    }

    void overridableFunction()
    { ... // overridden }
}

理想情况下,我希望Child构造函数的执行流程是 Parent() --> Parent.overridableFunction() --> Child.overridableFunction()

如何在不复制和粘贴内容的情况下实现此目的,从而使代码成为WET?

2 个答案:

答案 0 :(得分:1)

如果您希望Parent的构造函数执行自己的overridableFunction()Child构造函数的实现来执行自己的{{1}实现你基本上说的是,你不希望overridableFunction() Child覆盖overridableFunction()的{​​{1}}方法。

您可以为这两种方法指定不同的名称,或保持名称相同,但将Parent的方法设为私有,以避免任何重写。

答案 1 :(得分:0)

我不确定你为什么要这样做,但这遵循你要求的执行流程:

class Parent
{
    Parent()
    {
        overridableFunction();
    }

    void overridableFunction()
    { System.out.println("Parent implementation "); }

    public static void main(String[] args) {
         new Child();
    }
}

class Child extends Parent
{
    Child()
    {
        super();
        //remove overridableFunction();
    }

    @Override
    void overridableFunction()
    {
        super.overridableFunction();
        System.out.println("Child implementation ");
    }
}