在Java中,是否可以以始终执行“本地定义”版本而不是子类的重写版本的方式调用可重写方法?即有没有类似的super引用此类而不是超类的?
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”。
new B().bar()
bar()
A
foo()
B
有没有一种方法可以强制该bar()方法调用而不是中foo()定义的方法?就像我可以使用在调用中定义的方法?不幸的是,使用仍然会调用子类的版本。甚至类似或不起作用的东西。A``B``super.foo()``B``foo()``A``this.foo()``((A) this).foo()``A.this.foo()
A``B``super.foo()``B``foo()``A``this.foo()``((A) this).foo()``A.this.foo()
显然,我可以简单地定义foo()in 的私有或最终版本,A然后调用它。但是我希望找到一个解决方案,我所要做的就是将上面代码示例中的“重要行”更改为一种不同的调用foo()的方式,以使其打印“ A上的Foo”,最好不要使用诸如反射之类的技巧。
要么将您的方法设为静态(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 }