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. 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
    1. 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
    2. 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
    3. 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. 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,