IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Appeler une méthode par une sous classe


Sujet :

avec Java

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2011
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 135
    Par défaut Appeler une méthode par une sous classe
    Bonjour,

    J'ai 3 classes :
    GrandMere et Mere(extends GrandMere) et Fille(extends Mere), dont chacune possède une méthode int somme () qui retourne une telle valeur.
    Je voudrais appeler la méthode de la classe "GrandMere" par la classe "Fille", j'ai utilisé ce syntaxe mais il a envoyé le résultat de la classe "Mere" et non pas celle de classe "GrandMere" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public int res3=((GrandMere)(this)).somme();
    Classe GrandMere :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class GrandMere {
    	public int x=2;
    public GrandMere ()
    {
    	System.out.println("Bonjour de GrandMere ");
    }
     
    public int somme ()
    {
    	return 1;
    }
    Classe Mere :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class Mere extends GrandMere{
    	public float x=2F;
    public Mere ()
    {
    	System.out.println("Bonjour de Mere ");
    }
     
    public int somme ()
    {
    	return 2;
    }
    Classe Fille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
    public class Fille extends Mere{
    	public double x=10.50;
    	public int res1=somme();
    	public int res2=super.somme();
    	public int res3=(Mere)(super.somme();
    	public int somme ()
    	{
    		return 3;
    	}
    	public static void main(String [] args)
    	{
    		Fille f=new Fille ();
    		System.out.println(" méthode de la classe Fille" + f.res1 +  " ,méthode de la classe Mere" + f.res2 + " ,méthode de la classe GrandMere);
     
    	}
    }
    Résultat obtenu :
    méthode de la classe Fille 3, méthode de la classe Mere 2, méthode de la classe GrandMere 2 à la place de 1 !!

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Tu ne peux pas, tu ne peux qu'accéder à la méthode du parent via super. Le parent est là pour te cacher l'implémentation du grand parent, tu ne peux pas contourner ça. C'est un des principe de base de la POO: l'encapsulation. Mere est un tout dont Fille n'a pas besoin de connaitre les détails.

    C'est un problème de design d'ailleurs d'avoir besoin de ça. Fille n'a pas besoin de savoir que Mere travaille en redéfinissant la somme de GrandMere, voir même de savoir que GrandMere a une somme... Je serais d'ailleurs curieux de voir un cas concret de ce genre de besoin, parce que là à part faire du test, dans ton exemple, ça n'a absolument aucun intérêt.

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2011
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 135
    Par défaut
    Merci beaucoup.
    Oui c'est juste un exemple de test (je suis entrain de réviser mes connaissances en Java puisque ça fait longtemps que j'avais pas l'utilisé).
    Mais dans le cas des attributs la classe fille peut la valeur d'un attribut de celle de GrandMere en se basant sur le surcharge des attributs c'est pour ça j'ai voulu tester avec les méthodes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	public double x=10.50;
    	public float t=super.x;
    	public int i=((GrandMere)this).x;

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Il y a une différence entre surcharge et redéfinition. Quand tu crée dans une classe fille un attribut qui a le même nom que celui d'une classe parente, tu crée un attribut qui en fait n'a rien à voir. Il se trouve juste que par hasard il porte le même nom. Le code de la classe parente n'utilisera jamais l'attribut présent dans l'enfant et le code dans la classe enfant utilisera celui de la classe enfant, sauf indication contraire. C'est donc une surcharge: deux choses différentes qui portent le même nom.

    Quand tu crée dans une classe enfant une méthode qui a la même signature que la méthode dans le parent et que la méthode dans le parent n'est pas privée, alors il y a redéfinition. Tu recrée une méthode qui remplace l'ancienne. Comme c'est un remplacement, il n'y a pas accès à la méthode remplacée. Exception faite du super dans le code de l'enfant, qui permet de réutiliser le comportement du parent si on en a besoin.

    Donc ton premier exemple avec les méthodes: redéfinition. Le mot clé super aide à remonter à la définition précédente. La nouvelle méthode prend la place de l'ancienne. Le type déclaré de l'objet importe peux, tout ce qui compte pour la jvm c'est son typer réel à l'exécution
    Dans ton deuxième exemple avec les attribut: redéfinition. C'est à la compilation que se fait le choix d'utiliser Fille.x ou Mere.x ou GrandMere.x. Le type réel importe peu, si ce n'est qu'il doit correspondre à ce qui a été déclaré dans le cast.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/12/2011, 20h15
  2. Réponses: 10
    Dernier message: 28/05/2009, 09h29
  3. Réponses: 3
    Dernier message: 05/06/2007, 10h46
  4. Réponses: 6
    Dernier message: 20/04/2007, 15h24
  5. Réponses: 11
    Dernier message: 05/10/2006, 13h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo