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...
Le mot-clé static ou les attributs et méthodes de classe en POO Voir(NOTE: Cet article explique la signification du mot-clé static au sein d'une classe. La signification de "static" en C n'a par exemple rien à voir.) Vous êtes débutant en programmation orientée objet. En Java, en C++...ou que sais-je encore,...
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...
Java - L'accessibilité VoirLa notion d'accessibilité Le concept d'accessibilité (généralement appelé encapsulation) définit la possibilité qu'a le concepteur d'une classe de restreindre l'accès à certaines données, ou plus généralement à certains éléments (méthodes, classes,...
Javascript: les méthodes associées aux objets VoirQu'appelle-t-on une méthode? Une méthode est une fonction associée à un objet, c'est-à-dire une action que l'on peut faire exécuter à un objet. Les méthodes des objets du navigateur sont des fonctions définies à l'avance par les normes HTML, on ne...

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