小编典典

Java:在“这个”类而不是子类中调用函数(类似于“超级”)

java

在Java中,是否可以以始终执行“本地定义”版本而不是子类的重写版本的方式调用可重写方法?即有没有类似的super引用此类而不是超类的?

让我给出一个代码示例,希望可以清楚地说明我要执行的操作:

class A {
    void foo() {
        System.out.println("Foo from A");
    }

    void bar() {
        foo();  // <-- This is the important line!
    }
}

class B extends A {
    @Override
    void foo() {
        System.out.println("Foo from B");
    }
}

如果这样做new B().bar(),它将调用中bar()定义的方法A,该方法将foo()被覆盖B以打印“ B的Foo”。

有没有一种方法可以强制该bar()方法调用而不是中foo()定义的方法?就像我可以使用在调用中定义的方法?不幸的是,使用仍然会调用子类的版本。甚至类似或不起作用的东西。A``B``super.foo()``B``foo()``A``this.foo()``((A) this).foo()``A.this.foo()

显然,我可以简单地定义foo()in
的私有或最终版本,A然后调用它。但是我希望找到一个解决方案,我所要做的就是将上面代码示例中的“重要行”更改为一种不同的调用foo()的方式,以使其打印“
A上的Foo”,最好不要使用诸如反射之类的技巧。


阅读 238

收藏
2020-11-19

共1个答案

小编典典

要么将您的方法设为静态(baadddddd),要么更改您的设计。

确实,为子类提供默认行为是没有意义的,该子类被定义为适合于所关注的方法。

由于您的foo()方法似乎有所不同,因此您可以实施以下策略模式:

interface BarProcess{
    void foo();
}

public class DefaultBarProcess implements BarProcess{
    void foo() {
       System.out.println("Foo from A");
    }
}

public class AnotherBarProcess implements BarProcess{
    void foo() {
       System.out.println("Foo from B");
    }
}

class A {

    private BarProcess barProcess;

    public A(Bar barProcess){
      this.barProcess = barProcess;
    }

    void bar() {
        barProcess.foo();
    }
}

class B extends A {  //deprecated! No need to exist

}
2020-11-19