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

Langage Java Discussion :

Syntaxe méthode hérité


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Par défaut Syntaxe méthode hérité
    bonjour,
    débutant en java je me heurte à l'erreur suivante :
    La méthode de la classe mère n'est pas appicable dans la classe fille.

    Ma classe mère :
    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
    public class Humain {
    // propriété
    int taille;
    int poids;
    //constructeur
    public Humain(){
        taille = 0;
        poids = 0;
    }
    public Humain (int taille, int poids){
    this.taille = taille;
    this.poids =  poids;
    }
    public String  parler(String nat)   {
        return nat;
    }
    ma classe fille:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Homme extends Humain {
        // propriété
           
       // constructeur hérité
    public Homme(int taille, int poids) {
     super(taille, poids); 
            }
    public String  parler(String nat){ //ICI est l'erreur 
    super.parler();
    }
    }
    Merci de votre aide

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    La methode parler() (sans arguments) n'existe pas dans la classe mere.

    Je pense que ce que tu voulais ecrire, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public String  parler(String nat){
      return super.parler(nat);
    }

  3. #3
    Membre émérite

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Par défaut
    salut,
    je suis encore débutant alors je vais peut etre dire une betise mais si tu as posé ton code au complet il n'y a pas de main c'est normal ?
    deuxieme chose j'ai l'impression que tu as deux méthodes "parler :
    public String parler(String nat) {
    return nat;
    et
    public String parler(String nat){
    super.parler();
    je ne sais pas si ca vient de la mais ca me parait bizarre

    edit : lol grillé sur le fil par sanguko
    PS : tu pourrai peut etre m'expliquer ce que j'ai pas compris (ci dessus) ?

  4. #4
    Membre expérimenté
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Par défaut
    super.parler() te retourn un String
    donc you are missing return super.parler() mais si tu va faire tu as juste a ne pas l override et ca fera ca.

  5. #5
    Membre éprouvé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Par défaut
    Merci jhaythem, Sanguko

    return super.parler(nat); //OK


    Pour nayah, je me lance dans l'explication :
    Ma classe Homme hérite de la classe Humain, dans cette dernière la méthode parler n'est pas abstraite donc le corps est déja défini, je n'ai qu'a l'utiliser tels quel dans ma classe humain (factorisation du code).

  6. #6
    Membre émérite

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Par défaut
    Citation Envoyé par totoche Voir le message
    Ma classe Homme hérite de la classe Humain, dans cette dernière la méthode parler n'est pas abstraite donc le corps est déja défini, je n'ai qu'a l'utiliser tels quel dans ma classe humain (factorisation du code).
    je vois ce que tu veux dire mais il y a une chose que je comprends pas tu définis une premiere fois une méthode parler dans ta classe mere :

    public String parler(String nat) {
    return nat;
    et une seconde fois dans ta classe fille :

    public String parler(String nat){
    super.parler();
    si cette méthode étais abstraite je comprendrai pourquoi tu la défini une deuxieme fois mais la je seche... (dsl je suis un c'est dans ma signature )

  7. #7
    Membre confirmé Avatar de kerinel
    Profil pro
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Par défaut
    Bonjour,
    effectivement présenté tel quel tu n'as pas besoin de redéfinir la méthode parler pour faire exactement la même chose que ce que fait la classe mère.
    Tu surcharges la méthode seulement dans les cas suivant:

    - si le traitement est différent

    - si la méthode est déclarée abstract (si la classe mère est "abstract" ce n'est pas un problème si la méthode n'est pas déclarée abstract)

    - si tu hérites la méthode d'une interface (mais dans ce cas on ne peux pas vraiment parler de surcharger la méthode)

    Dans ton cas la surcharge a donc un intérêt si tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public String parler (String nat){
    		String s =super(nat);
                   //traitement sur s;
                  return s; 
    }
    par exemple. le super n'est même pas obligatoire.

    bon code,
    kerinel

    edit : grillé...

  8. #8
    Membre émérite

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Par défaut
    ok c'est bien ce qui me sembler mais je suis pas encore a l'aise avec tout ca alors j'évite de trop m'avancer

  9. #9
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kerinel Voir le message
    Dans ton cas la surcharge a donc un intérêt si tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public String parler (String nat){
    	String s =super(nat);
    	//traitement sur s;
    	return s; 
    }
    C'est plutôt super.nomDeLaMethode et donc super.parler dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public String parler (String nat){
    	String s =super.parler(nat);
    	//traitement sur s;
    	return s; 
    }
    Citation Envoyé par kerinel Voir le message
    le super n'est même pas obligatoire.
    Oui il l'est car sinon tu va rappeler la même méthode en boucle et non pas la méthode parente...

    a++

  10. #10
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    totoche >> Tu confonds héritage et redéfinition.


    Déjà dans ton code on peut lire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    // constructeur hérité
    Ce qui est complètement faux puisque les constructeurs ne sont pas hérités : chaque classe possède ses propres constructeurs (qui font appel aux constructeur de la classe parente).



    Ensuite l'héritage consiste pour une classe fille a avoir directement accès aux méthodes de la classe parente. Donc tu n'as pas besoin de recoder parler() dans Humain :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Homme extends Humain {
     
    	// constructeur
    	public Homme(int taille, int poids) {
    		super(taille, poids); 
    	}
     
    }
    La méthode parler() sera quand même disponible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Humain h = new Humain( ... );
    String hello = h.parler("Hello");


    Quand à la redéfinition d'une méthode (override en anglais), cela consiste à réécrire le code d'une méthode de la classe parente, éventuellement en la réutilisant pour modifier son comportement, par exemple tu pourrais faire quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Homme extends Humain {
     
    	// constructeur
    	public Homme(int taille, int poids) {
    		super(taille, poids); 
    	}
     
    	@Override
    	public String parler(String nat) {
    		// On retourne la chaine entre quote :
    		return " ' " + super.parler(nat) + " ' ";
    	}
    }
    On a ici une redéfinition de la méthode parler(), qui modifie quelque peu son comportement d'origine et différencie un Humain d'un Homme...


    a++

  11. #11
    Membre émérite

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Par défaut
    heu une derniere question AdiGuba parce que j'ai un peu de mal :

    ca veut dire que j'avais raison de trouver ca bizarre ?

  12. #12
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nayah Voir le message
    ca veut dire que j'avais raison de trouver ca bizarre ?
    Ben oui !

    Ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public String  parler(String nat){
      return super.parler(nat);
    }
    Est totalement inutile dans ce cas précis, puisqu'on peut appeler directement la méthode parler() de la classe parente et que la redéfinition n'apporte rien de plus...


    Le seul cas où ce genre de code est utile c'est lorsque la méthode parente n'est pas publique et que l'on veut élargir sa visibilité (par exemple si parler() étaient déclaré en protected dans la classe parente et qu'on souhaite la rendre visible à tous dans la classe fille).

    a++

  13. #13
    Membre éprouvé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Par défaut
    "Et la lumière fut. " merci

    La notion de constructeur héritée était un hérésie voulue un raccourci impropre pour me souvenir qu 'on peut faire appel aux constructeur de la classe parente... je ne commenterai plus ainsi...

    Et quant à l'héritage d'une méthode sans parler override, je pensais qu'il fallait utiliser super, ce qui me parraissait contradictoire avec le concept d'héritage...

    Merci encore pour ce recadrage très clair

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

Discussions similaires

  1. ecraser la méthode clone() hérité de la classe parent
    Par Lorenzo77 dans le forum ActionScript 3
    Réponses: 6
    Dernier message: 22/08/2009, 22h11
  2. Syntaxe SQL avec méthode ADO
    Par Elremmiz dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/04/2008, 17h18
  3. outil/méthode pour vérifier la syntaxe d'une macro
    Par Anouschka dans le forum Linux
    Réponses: 2
    Dernier message: 16/11/2007, 14h05
  4. Réponses: 4
    Dernier message: 27/07/2007, 18h18
  5. [HTTP] Syntaxe méthode POST
    Par Gruik dans le forum Développement
    Réponses: 3
    Dernier message: 26/07/2003, 17h12

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