Rechercher : dans
Par :

Java redéfinition d'une méthode

Dernière réponse le 13 nov 2008 à 20:51:25 overcode, le 28 oct 2008 à 20:34:23 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « java redéfinition d'une méthode » dans :
Java: Les méthodes Voir La notion de fonction et de méthode On appelle fonction un sous-programme qui permet d'effectuer un ensemble d'instruction par simple appel de la fonction dans le corps du programme principal. Les fonctions permettent d'exécuter dans plusieurs...
Java - L'héritage Voir La notion d'héritage Le concept d'héritage est un des concepts les plus importants de la programmation orientée objet, car il conditionne irréversiblement la façon selon laquelle un code Java est écrit. L'héritage est un mécanisme permettant de...
Les classes Java VoirLa notion d'objet Le langage Java intègre fortement le concept objet, il s'agit donc d'un langage orienté objet (LOO). Le terme langage orienté objet est plus qu'une simple appellation de plus pour désigner un type de langage, il...
Introduction à RMI (Remote Method Invocation) VoirIntroduction à RMI RMI (Remote Method Invocation) est une API Java permettant de manipuler des objets distants (c'est-à-dire un objet instancié sur une autre machine virtuelle, éventuellement sur une autre machine du réseau) de manière...
Java - Premier programme VoirPremière application avec Java La première chose à faire est de créer un simple fichier texte (sans mise en forme) et de taper les quelques lignes suivantes : // Votre premiere application en Java class FirstApp { public static void main...

1

artragis, le 28 oct 2008 à 21:05:28

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

Répondre à artragis

2

overcode, le 28 oct 2008 à 21:08:17

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 ?

Répondre à overcode

3

Marco la baraque, le 28 oct 2008 à 21:27:41

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

Répondre à Marco la baraque

4

simowarez, le 29 oct 2008 à 19:46:21

Tu peut l'appeler simplement par super
super.f()
et le tour est joué

Répondre à simowarez

5

Marco la baraque, le 29 oct 2008 à 20:41:16

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,

Répondre à Marco la baraque

6

overcode, le 13 nov 2008 à 19:26:01

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 :)

Répondre à overcode

7

 Marco la baraque, le 13 nov 2008 à 20:51:25

Merci beaucoup Overcode,
Je ne savais pas qu'on pouvait faire ça en C++, c'est intéressant.

Bien cordialement, rtfm and jfgi

Répondre à Marco la baraque