Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Java] Poo, héritage et polymorphisme

    4 mai 2007 à 11:27:11

    Bonjour à tous et à chacun :)

    Après avoir suivis les cours de C de Matteo, je m'attaque à l'apprentissage du Java. Comme il y a peu de cours sur le SdZ, j'ai décidais de l'apprendre sur d'autre site.
    Mais je reste un petit zéros, et je doit bien avouer que je galère bien comme il faut. Je bloque avec la notion de polymorphisme. J'ai a peu près compris la notion d'héritage (mais j'ai encore du mal avec "this" et "super") en revanche, je ne comprend rien du tout au polymorphisme. Pouvez vous m'aider ? Sans forcément rentrer dans les détail,juste pour m'expliquer la notion.

    D'avance merci :)
    • Partager sur Facebook
    • Partager sur Twitter
      5 mai 2007 à 15:52:42

      Salut,

      Le polymorphisme peut prendre plusieurs forme (hihi)

      Deja en java un objet peut "heriter" de deux facons d'un autre objet:
      -avec extends, que tu dois connaitre, c'est un heritage direct, "pur". Il n'est pas nécéssaire de redéfinir les methodes.
      -avec implement: c'est une facon de contourner l'heritage unique, qu'il y a dans java et pas dans C++. une classe implémente obligatoirement une interface; il est donc obligatoire de redéfinir les méthodes de l'interface.

      Le polymorphisme commence deja par là, cette facon de "tromper" l'heritage.

      Ensuite il permet de transformer un objet, en l'objet dont il a hérité.
      Je n'ai pas la syntaxe exacte, mais par exemple, quand tu mets un objet dans une ArrayList, celui ci prend la forme de la mere de tous les objets: Object.
      Si tu veux retravailler dessus, tu dois en quelques sortes l'extirper de ton ArrayList, et indiquer au compilateur quel objet en particulier c'est.

      J'ai peut etre dit des bêtises, je débute en Java. Mais ca devrait t'aider à t'interesser plus au concept.
      • Partager sur Facebook
      • Partager sur Twitter
        6 mai 2007 à 11:32:13

        En fait, je croit avoir compris.

        L'héritage permet d'avoir accès, via une classe fille, à toute les méthode de la classe mère. On peux en outre, dans la classe fille, redéfinir des méthode portant le même noms que dans la classe mère grace à des constructeur.
        Dans une classe fille, pour spécifier une méthode propre à la classe fille, on utilise "this". Si on souhaite accéder à une classe de la classe mère, on utilise "super".

        Le polymorphisme permet de définir par une classe (A par exemple), un objet(appeler O pour l'exemple toujours) d'une autre classe (B). Si j'appelle une méthode de mon objet O, alors le PC va chercher dans la classe B la méthode. Si il la trouve il l'utilise (même si cette méthode existe dans A). Si il ne la trouve pas, il va chercher dans A cette méthode.

        Mais en y réfléchissant, je saisis mal la différence entre le polymorphisme et l'héritage étant donner que dans les deux cas, on hérite d'une classe et c'est toujours les méthode de la classe fille qui sont utilisé en priorité...
        • Partager sur Facebook
        • Partager sur Twitter
          6 mai 2007 à 12:18:11

          L'héritage consiste en gros à réutiliser une partie des méthodes et membres d'une classe mère, pour éviter d'avoir à réécrire une partie du code qui est commune.

          Le polymorphisme. Je pense que le plus simple c'est un exemple.
          Tu as une classe "Vehicule" qui est un engin qui peut aller sur la route.
          Logiquement, la classe "Voiture" est une classe fille de la classe "Vehicule" (héritage).
          De même, "Moto" est une autre classe qui hérite de "Vehicule".

          Maintenant, imagine que tu as une méthode (ailleurs dans ton code) qui permet d'ajouter un véhicule à la carte.
          Tu aurais une définition du genre: ajouterVehicule(Vehicule monVehicule).
          Mais est-ce que tu va t'amuser ensuite à réécrire des fonction ajouterVoiture et ajouterMoto ?
          Non, car une moto ou une voiture reste un véhicule donc tu peux utiliser ajouterVehicule.

          En contre partie, le code à l'intérieur de ta fonction ne pourra utiliser que les méthodes de la classe "Vehicule" mais pas les méthodes de "Moto" ou "Voiture" car il ne sait pas précisément de quel type la variable est exactement.

          Citation : wikipedia

          le polymorphisme est l'idée d'autoriser le même code à être utilisé avec différents types, ce qui permet des implémentations plus abstraites et générales.

          Ton code fonctionne bien avec plusieurs types ("Vehicule", "Voiture", "Moto"), sans avoir à gérer chaque cas, donc il est assez "général".

          Bien sûr, le polymorphisme va de pair avec l'héritage et la surcharge des méthodes. C'est tout le principe: le code va appeler une méthode définie par "Vehicule" mais peut-être que cette méthode a été surchargée (remplacée) et le résultat sera alors différent.
          • Partager sur Facebook
          • Partager sur Twitter
            6 mai 2007 à 12:24:19

            Salut,

            Héritage et polymorphisme sont effectivement assez liés.

            L'héritage, c'est le fait qu'une classe "hérite" (ou "dérive") d'une autre, et en récupère de fait toutes les méthodes et tous les champs (sauf les privés).

            Le polymorphisme, c'est le fait qu'un objet peut paraître avoir plusieurs types.

            Si je reprends ton exemple (dans lequel la classe B dérive de la classe A, et O est une instance de la classe B) : le "vrai" type de O est B, mais on peut pourtant utiliser cet objet partout où un objet de type A est attendu (dans l'appel d'une méthode qui attend un objet de type A, par exemple). Donc O semble avoir plusieurs types au même moment (même si son type réel est B). C'est le polymorphisme.

            À noter qu'en Java, l'héritage d'implémentation (hériter d'une classe) n'est pas le seul moyen de faire du polymorphisme, il existe aussi l'héritage d'interfaces.

            Par exemple, en plus des classes A et B, tu pourrais aussi définir une interface I, et faire en sorte que B implémente cette interface. Dans ce cas, l'objet O pourrait être utilisé partout où un objet de type I est attendu.

            Edit: Grillé...
            • Partager sur Facebook
            • Partager sur Twitter
              6 mai 2007 à 18:10:09

              Merci beaucoup, j'ai tout compris ! :)
              Rassurez moi, une fois que j'ai compris ca, j'ai fais le plus dur dans l'apprentissage de la programmation en Java ? Car je me suis vraiment arraché les cheuveux la dessus !
              • Partager sur Facebook
              • Partager sur Twitter
                6 mai 2007 à 21:46:22

                Ah non, tu n'es pas au bout de tes peines ! :p

                En gros, programmer en Java (ou dans un autre langage orienté objet) nécessite 4 types de connaissances :

                a) la connaissance du langage lui-même (la syntaxe, les mots-clés, etc.) ;

                b) la (les) bibliothèque(s) de classe associée(s) à ce langage (pas la peine --- et impossible --- de les connaître par coeur, mais il faut en connaître les classes les plus courantes et savoir utiliser la documentation quand on a besoin des autres) ;

                c) les concepts de la programmation orientée objet (notion d'héritage, de polymorphisme, entre autres).

                A priori, tu connais déjà ces trois points. Mais ce n'est pas tout :

                d) connaître ces concepts de la POO ne suffit pas, il faut encore savoir les utiliser à bon escient et ce n'est pas si évident que ça n'y parait. Pire encore, il est très facile en manipulant ces concepts de mettre au point un design que l'on imagine très performant et très adapté au problème, et qui s'avère en réalité désastreux (c'est du vécu...)

                Pour le dernier point, un bon bouquin sur la POO (en particulier sur les design patterns) est un plus indispensable.
                • Partager sur Facebook
                • Partager sur Twitter
                  6 mai 2007 à 22:55:53

                  Hum, ce dernier points, oui, ca va être coton pour l'assimiler, parce que c'est bien mignon de connaitre tout ca, mais, comme j'ai appris le C (grace au cours de matteo) de passer d'une conception traditionnel à une conception en java, me semble vraiment très très difficile...
                  Mais maintenant, je n'ai plus de concept méga tordu à comprendre !
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [Java] Poo, héritage et polymorphisme

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown