【发布时间】:2012-11-15 17:31:36
【问题描述】:
是否可以在 Java 中调用可覆盖的方法,使其始终执行“本地定义”的版本,而不是子类的覆盖版本? IE。 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(),它将调用A 中定义的bar() 方法,该方法调用foo() 以在B 中被覆盖以打印“Foo from B”。
有没有一种方法可以强制bar() 方法调用A 中定义的foo() 方法,而不是B?就像我可以在B 中使用super.foo() 来调用foo() 中定义的foo() 方法A?不幸的是,使用this.foo() 仍然调用子类的版本。即使像 ((A) this).foo() 或 A.this.foo() 这样的东西也不起作用。
显然,我可以简单地在 A 中定义 foo() 的私有或最终版本,然后调用它。但我希望有一个解决方案,我所做的只是将上面代码示例中的“重要行”更改为调用 foo() 以使其打印“Foo from A”的不同方式,最好不要使用反射之类的技巧。
【问题讨论】:
-
调用哪个
foo()是由value(实例)的类型决定的,而不是由variable的类型决定的,我. e.A a = new B(); a.foo();打电话给B.foo()。 -
您似乎发现了继承的(许多)问题之一。你最好使用组合而不是继承,这将产生更容易阅读、理解和弄清楚它在做什么的代码。
-
@Guillaume 我很惊讶这并没有经常出现而无法解决。例如,我正在考虑像 OutputStream 这样的所有基类型类,它们通过将它们转发到 write(int b) 来提供回退方法实现,如 write(byte[] b)。如果两者都覆盖,则不能再使用 super 来使用回退。
标签: java inheritance