Re: Accessing grandparent's overridden methods.
Mark Rafn wrote:
[ B extends A, C extends B, each implements/overrides showMe() ]
Kira Yamato <kirakun@earthlink.net> wrote:
Question: how can I [in class C] access class A's showMe()?
I'm suspecting this cannot be done without modifying codes
outside of class C.
1) if you need to do this, you've probably got a broken object model. You
shouldn't know or care about it's implementation beyond what method signatures
are available to you.
Strongly agree. Either C should not be calling A's method, or B's
version does not do the same job as A's method, and should have a
different name.
2) If you really need it, you could use reflection.
this.getClass().getSuperclass().getSuperclass().getMethod("showMe", null)
will get you the Method you want to call.
This does not seem to work. However, to be fair, I was not really
expecting it to work so I may have missed something. Please review. I get:
Direct showMe call
C
Super call
B
Refection call
C
when I run the following. Note that I would only throw "Exception" in a
test program, where I want any problem in the reflection, no matter what
it is, to flow to the top and crash the program.
public class ReflectionTest {
public static void main(String[] args)
throws Exception {
new C().test();
}
static class A {
public void showMe() {
System.out.println("A");
}
}
static class B extends A {
public void showMe() {
System.out.println("B");
}
}
static class C extends B {
public void showMe() {
System.out.println("C");
}
public void test() throws Exception {
System.out.println("Direct showMe call");
showMe(); // prints C
System.out.println("Super call");
super.showMe(); // prints B
System.out.println("Refection call");
Method grandparentMethod =
getClass().getSuperclass().getSuperclass()
.getMethod("showMe", (Class[]) null);
grandparentMethod.invoke(this, new Object[0]);
}
}
}