覆盖方法:如何“注入”超级方法?

时间:2013-01-18 18:30:04

标签: java override method-invocation

假设有三个类,一个是另一个类的子类。每一个都覆盖父母'方法

public class BaseClass {

    public void doStuff() {
        performBaseTasks();
    }

}

public class MiddleClass extends BaseClass {

    // {BaseClass} Overrides

    public void doStuff() {
        performMiddleTasks();
        super.doStuff();
    }

}

public class FinalClass extends MiddleClass {

    // {BaseClass} Overrides

    public void doStuff() {
        performFinalTasks();
        super.doStuff();
    }

}

调用new FinalClass().doStuff()时,这将导致一种方法 调用顺序如下:

  1. performFinalTasks();
  2. performMiddleTasks();
  3. performBaseTasks();
  4. 我想将perfomFinalTasks()置于performMiddleTasks()和之间 performBaseTasks()。我怎么能这样做?

    1. performMiddleTasks();
    2. performFinalTasks();
    3. performBaseTasks();

2 个答案:

答案 0 :(得分:2)

在final类doStuffDifferently()中编写一个公共方法,并按此顺序调用这些方法。我不确定是否可以通过doStuff()方法中的任何其他技巧来实现。

答案 1 :(得分:1)

一种可能的方法,如果你可以使中产阶级抽象:

public abstract class MiddleClass extends BaseClass {

    // {BaseClass} Overrides
    public void doStuff() {
        performMiddleTasks();
        doProxyExec();
        super.doStuff();
    }

    public abstract void doProxyExec();
}

您可以覆盖子类中的代理方法:

public class FinalClass extends MiddleClass {

    // {BaseClass} Overrides
    public void doStuff() {
        super.doStuff();
    }

    // {MiddleClass} Overrides
    public void doProxyExec(
        performFinalTasks();
    }
}

一种不是非常多态的方法调用链接方法,但是原来的设计又有点奇怪。