2009-06-29 8 views
0

Tenir compte des classes suivantes en Javaappel de la méthode d'une classe plus haut dans la hiérarchie

class A 
{ 
    protected void methodA() 
    { 
     System.out.println("methodA() in A"); 
    } 

} 

class B extends A 
{ 
    protected void methodA() // overrides methodA() 
    { 
     System.out.println("methodA() in B"); 
    } 

    protected void methodB() 
    { 
    } 
} 

public class C extends B // needs the functionality of methodB() 
{ 
    public void methodC() 
    { 
     methodA(); // prints "methodA() in B" 
    } 
} 

Comment appeler le methodA() protégé de substitution dans une methodC() dans la classe C? Est-ce possible?

+1

La question est pourquoi devriez-vous jamais besoin de faire cette? – jitter

+0

Juste un cas où, il y a un besoin où j'ai besoin de conserver certaines fonctionnalités dans A et aussi besoin de la fonctionnalité dans B. – Ram

Répondre

0

This ressemble à vous problème

Pouvez-vous modifier B et ajouter une fonction qui appelle super.MethodA()? alors appelle ça en C?

2

Vous avez quelques options. Si le code source de la classe B est disponible, modifiez la classe B. Si vous n'avez pas le code source, envisagez d'injecter du code dans la méthode A de la classe B(). AspectJ peut insérer du code dans un binaire Java existant.

changement de classe B

package com.wms.test; 

public class A { 
    public A() { 
    } 

    protected void methodA() { 
    System.out.println("A::methodA"); 
    } 
} 

package com.wms.test; 

public class B extends A { 
    public B() { 
    } 

    protected void methodA() { 
    if(superA()) { 
     super.methodA(); 
    } 
    else { 
     System.out.println("B::methodA"); 
    } 
    } 

    protected void methodB() { 
    System.out.println("B::methodB"); 
    } 

    protected boolean superA() { 
    return false; 
    } 
} 

package com.wms.test; 

public class C extends B { 
    public C() { 
    } 

    protected void methodC() { 
    methodA(); 
    } 

    protected boolean superA() { 
    return true; 
    } 

    public static void main(String args[]) { 
    C c = new C(); 

    c.methodC(); 
    } 
} 

Puis:

 
    $ javac com/wms/test/*.java 
    $ java com.wms.test.C 
    A::methodA

Ce qui suit ne fonctionne pas:

protected void methodC() { 
    ((A)this).methodA(); 
    } 
Questions connexes