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 :

[POO] Méthodes : Surcharge, polymorphe, redéfinition


Sujet :

Langage Java

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Par défaut [POO] Méthodes : Surcharge, polymorphe, redéfinition
    Bonjour.

    Je sais que surcharger une méthode dans une classe reviens à à la réécrire, mais en modifiant le type, le nombre ou l'ordre de ses arguments.
    Je sais que redéfinir une méthode dans une classe fille reviens à réécrire le même corps (même nom, type de retour et arguments) mais à changer la manière dont la méthode traite les choses.

    Là où je bloque, c'est avec le polymorphisme. En fait, je ne comprends pas quelle différence il y a avec la redéfinition d'une méthode, je fais exactement la même chose, je garde la même structure et je change le code entre les accolades. Du coup à chaque fois que je redéfinis une méthode, je la rend polymorphe ?

    Merci à vous

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Le polymorphisme, c'est le fait de pouvoir substituer un objet à un autre similaire. Donc dire qu'une méthode est "polymorphe" n'a pas de sens puisque ce concept est lié aux classes.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Par défaut
    Merci pour ta réponse.

    J'apprends Java via un tutoriel
    Il parle bien de méthodes polymorphes, du coup je suis un peu perdu...
    Selon eux une méthod epolymorphe est une méthode pouvant être appelée sans avoir à se soucier du type de l'objet.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Ce qu'il appelle une méthode polymorphe c'est bêtement une redéfinition.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Par défaut
    Ah très bien ! Merci, et il y a une autre chose que je ne saisis pas :

    J'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(Object v : tableau){
          System.out.println(v.decrisToi()+"\n");
    }
    La variable tableau contient des objets de type Ville et de type Capitale (Capitale hérite de Ville). Ce code ne fonctionne pas, car la méthode decrisToi() n'est pas définie dans la classe Object, et le tuto nous dis Vous devez savoir qu'une méthode n'est « invocable » par un objet que si celui-ci définit ladite méthode.. On me parle de covariance de variable, donc dans cette boucle, je ne manipule que des objets de type Object, mais qui contiennent des objets de type Ville ou Capitale. Du coup je ne comprends pas pourquoi ca plante, pourquoi est-ce que la JVM, voyant que decrisToi() n'est pas définie dans la classe Object, ne va pas regarder dans les classe Ville ou Capitale, en clair pourquoi est-ce qu'elle n'arrive pas à détecter le type de l'objet.

    Merci

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Citation Envoyé par Compassio Voir le message
    je ne manipule que des objets de type Object, mais qui contiennent des objets de type Ville ou Capitale.
    Ca, le compilateur ne le sait pas, on ne peux le savoir qu'à l'exécution, et le compilateur en java, il a besoin d'être sûr que la méthode existe.

    Donc soit Capitale extends Ville, alors il faut écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(Ville v : tableau){
          System.out.println(v.decrisToi()+"\n");
    }
    Soit Capitale et Ville on un ancêtre commun qui contient la définition de decrisToi, alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(GeoItem v : tableau){
          System.out.println(v.decrisToi()+"\n");
    }
    Soit tu a une interface commune à Ville et Capitale qui imposent que toutes deux ont un méthode decrisToi, alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(AutoDecrivant v : tableau){
          System.out.println(v.decrisToi()+"\n");
    }

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Par défaut
    Merci pour ta réponse
    Le tuto nous propose aussi de faire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(Object v : tableau){
          System.out.println(((Ville)v).decrisToi();+"\n");
    }
    Je ne comprends pas cette directive
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((Ville)v).decrisToi();
    Cela transforme l'objet de type Object en type Ville ? Si jamais mon objet est de base de type Capital, est-ce que c'est la méthode decrisToi() de la classe Ville ou Capitale qui va être appelée ?

    Merci encore

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Citation Envoyé par Compassio Voir le message

    Cela transforme l'objet de type Object en type Ville ?
    Non, ça dit juste au compilateur que c'est une Ville, ca ne transforme pas l'objet. Du coup le compilateur va te croire et ajouter du code pour vérifier à l'exécution que c'est bien le cas. Du coup tu peux appeler les méthode de Ville

    Citation Envoyé par Compassio Voir le message
    Si jamais mon objet est de base de type Capital, est-ce que c'est la méthode decrisToi() de la classe Ville ou Capitale qui va être appelée ?
    Ca dépend si Capitale redéfinis cette méthode ou pas.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Par défaut
    Du coup si cela ne tranforme pas l'objet, cela veut dire que tout mes objets sont de type Object (dans ce cas précis). C'est cette notion que j'ai u mal à comprendre, grâce à la covariance, je peux avoir des objets de type Ville ou Capital car ils héritent d'Object, mais pourtant il faut que j'indique que l'objet est de type Ville, mais cela ne modifie pas l'objet... Je t'avoue que là je suis complètement largué

    Oui Capital redéfinis la méthode

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Citation Envoyé par Compassio Voir le message
    Du coup si cela ne tranforme pas l'objet, cela veut dire que tout mes objets sont de type Object (dans ce cas précis).
    Non, il sont du type qui a été utilisé pour faire leur new et rien d'autre. Après dans ton code, du déclare le type des variable, genre

    Object a = new Ville();

    Tu crée un objet de type Ville, dans le stocke dans une variable de type "référence à un objet"

    Le compilateur utilise le type des tes variable pour déterminer les méthodes utilisable, la JVM utilie le type réel pour déterminer concrètement quelle méthode appeler.

  11. #11
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 812
    Par défaut
    Parce que tu as du mal

    Oublies la classe Object.

    Ta classe de base c'est Ville.
    Dans tes algos tu vas utiliser cette classe.

    Mais tu ne vas jamais créer d'objet de type Ville (*), mais des objets Capitale, Préfecture, Village ou autre.

    Et c'est grâce au polymorphisme, que ton code à l'exécution va s'adapter au type réel.

    Par exemple, dans ton cas,
    1. Dans ton code tu fais un tableau de Ville que tu vas parcourir pour décrire chacune
    2. À l’exécution, ce ne sont pas des Ville qui vont être décrites mais des Capitale (avec sûrement en plus l'information de quel pays), des Préfecture (avec sûrement en plus l'information de quel département), ...



    * -> En fait tu peux utiliser aussi le type de base (ici Ville) mais ce sera pour du générique.

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Par défaut
    Je vais y aller doucement, l'objet c'est récent pour moi

    tableau contient 3 objets de type Ville et 3 objets de type Capitale.
    Dans ma boucle, je fais Donc je met chaque objet de type Ville ou Capital dans une variable de type Object, grâce à la covariance. Jusque là c'est bon ?

    Lorsque je fais un Ca ne fonctionne pas, car decrisToi() n'est pas définie dans la classe Object, il ne peut donc pas l'appeler.

    Maintenant si je fais :
    Que ce passe-t-il ? J'ai des objets Ville et Capital dans une variable référence à Object, et avec cette instruction j'indique que maintenant c'est une variable référence à Ville ?

    Merci pour votre patience

  13. #13
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Tu dis au compilateur, "ah tiens, figure-toi que cette variable de type Object. En fait, l'objet qui s'y trouve est aussi de type Ville. Sisi je te jure, vérifie ! Et donc, cet objet de type Ville, appelle sa méthode decrisToi()."

    Et ainsi le compilateur va compiler exactement ça : vérifier que l'objet est en fait de type Ville. Et que si oui, faire ce que tu voulais faire avec cet objet Ville.
    Et que si non, par contre, une erreur est lancée du fait que tu as menti et que l'objet n'est pas du tout de ce type-là. Sous forme d'une ClassCastException.

    Comme ce n'est pas franchement pratique de se demander si oui ou non on a le droit de faire des choses, le mieux est d'éviter cette notation autant que possible. Maintenant bon, on ne peut pas toujours l'éviter, c'est vrai.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Par défaut
    Merci ! C'est beaucoup plus clair maintenant !

    En fait il faut bien faire la différence entre une variable de type MonObjet qui fait référence à un objet, et une instance.

    Du coup par curiosité, comment ça ce passe, grossièrement, en mémoire lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object o = new Ville();
    Ma variable o fait référence à un objet Object, mais elle contient une référence vers un objet de type Ville.

  15. #15
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    En mémoire, les variables n'en ont rien à cirer du type de l'objet vers lequel elles pointent. C'est le compilateur qui tient à ce qu'on fasse pas n'importe quoi.

    Cela ne change rien au fait qu'un objet de type Ville a été créé avec new, et est donc stocké en mémoire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  16. #16
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Par défaut
    Super merci pour toutes ces précisions

  17. #17
    Expert confirmé

    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Avril 2002
    Messages
    2 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 905
    Par défaut
    Il y à des cours et tutoriels Java plus faciles pour débuter. Le plus facile et le plus amusant c'est celui ci : Programmation Java pour les enfants, les parents et les grands-parents.

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

Discussions similaires

  1. [POO]Méthode récursive pour tester dépendances
    Par viviboss dans le forum Langage
    Réponses: 4
    Dernier message: 28/05/2007, 13h06
  2. [POO] Méthode abstraite PHP4
    Par joebarteam88 dans le forum Langage
    Réponses: 2
    Dernier message: 30/04/2007, 08h32
  3. Réponses: 4
    Dernier message: 17/03/2007, 02h06
  4. Réponses: 4
    Dernier message: 05/02/2007, 15h40
  5. méthodes surchargées
    Par ep31 dans le forum C++
    Réponses: 4
    Dernier message: 14/11/2005, 19h06

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