Java redéfinition d'une méthode

Résolu
Salut,

Ayant le code suivant :

class A
{
public void f()
{
...
}
}

class B extends A
{
public void f()
{
...
}
}

Comment je pourrai appeler f de A à partir d'un objet de type B ?
B b = new B() ;
// Comment appeler f qui est dans A ?

Merci de répondre à cette question qui me torture (je viens du monde C++ ...)
Configuration: Firefox 3.0.3

5 réponses

  1. Merci Marco,

    En C++, ça se passe comme ça :

    class A
    {
    ...

    public :
    void f(void) ;

    ...
    } ;

    class B : public A
    {
    ...
    public :
    void f(void) ;

    ...
    } ;

    et maintenant à n'importe quel point du programme :

    B b ; // en supposant un constructeur void
    b.f() ; // appel de f de B
    b.A::f() ; // appel de f de A

    Désolé pour le retard :)
    1. Contributeur
      Merci beaucoup Overcode,
      Je ne savais pas qu'on pouvait faire ça en C++, c'est intéressant.

      Bien cordialement,
  2. Contributeur
    Bonsoir,
    @simowarez : mais non, la question n'est pas là. Overcode a surchargé sa méthode f pour en modifier le comportement. Ici la question est : j'ai une instance b de B (qui étend A). Comment puis-je faire pour appeler la méthode f de A depuis cette instance b.
    Ce n'est pas possible de faire b.super.f() par exemple.

    @overcode : j'ai trouvé une méthode utilisant l'introspection pour créer une nouvelle instance de a juste en connaissant b, par introspection. Je ne sais pas si ça répond à tes besoins ou non :
                    B b = new B();
    		Class aClass = b.getClass().getSuperclass();
    		Method m;
    		try {
    			m = b.getClass().getSuperclass().getDeclaredMethod("f");
    			m.invoke(aClass.newInstance(), new Object[0]);
    		} catch (SecurityException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (NoSuchMethodException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalArgumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InvocationTargetException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InstantiationException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    


    Cordialement,
    1. tu peut l'appeler simplement par super
      super.f()
      et le tour est joué
      1. super te permet d'appeler f de la superclasse A a partir de b
    2. Tu peux appeler f de B comme ceci :
      B b = new B() ;
      b.f() ;

      Mais comment retrouver f de A ? En C++ c'est possible mais en Java ?
      1. Contributeur
        Bonsoir,
        Ce n'est pas possible en java. En principe tu ne devrais jamais avoir à faire ça.
        B est une spécialisation de A. Si tu as besoin d'appeler la méthode f de B, tu instancies B. Si tu as besoin d'appeler la méthode f de a, pourquoi utilises-tu une instance de B et non pas de A ?

        Dans quel cas concret as-tu ce problème stp ?

        Cordialement,

        Edit : j'aimerais bien savoir comment tu fais ça en C++ aussi
    3. hé bien java est un langage objet, une fois que tu as dit que b héritait de a he ben, b aura une methode f() avec les mêmes arguments.
      enfin, logiquement, après moi c'est ce que j'ai compris dans les tutoriels que je lis