Partage
  • Partager sur Facebook
  • Partager sur Twitter

Java notion héritage

    2 avril 2007 à 9:45:30

    Bonjour,

    J'ai un petit problème, je débute en programmation Java et ayant des difficulté avec la notion d'héritage je me pose certaines questions, voici mon problème.
    Comment dans une classe dérivé puis -je récupérer une variable d'une méthode,
    je m'explique;
    La classe mère: j'ai fait une méthode me permettant de faire total=(a+b)²,
    La classe dérivée: je souhaite faire resultat= total-c

    Il est évident que je peut faire sa dans tout simplement dans mon main, mais c'est pour bien comprendre le concept de l'objet que je m'exerce.

    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      2 avril 2007 à 10:44:57

      Bonjour.

      Il y a en fait plusieurs façons de résoudre ce problème. Ces méthodes dépendent de la façon dont la classe mère a été implémentée. Si ce n'est pas par toi, il se peut donc que tu n'ais pas le choix...

      Soient A la classe mère et B sa fille.

      1- Accès directe : si la variable est publique (public double total), il suffit d'y accéder depuis B comme si elle y était :


      public class B extends A
      {
          public void methode()
          { 
              resultat= total-c;
          }
      }


      C'est une mauvaise manière de faire, car alors tous les objets ont accès à la variable. Ils peuvent donc la lire et la modifier. Cela est contraire à une idée fondamentale de la programmation qui veut qu'on cache le plus possible "l'intérieur" du code pour ne montrer que "l'extérieur" : c'est l'abstraction par la modularité.

      2- Accès par héritage : si la variable est protégée (protected double total), seules A et ses filles (dont B) peuvent y avoir accès. La variable est donc plus protégée qu'avant car seules les classes réellement concernées par la variable peuvent y avoir accès. B peut encore considérer que la variable lui appartient, comme en 1.

      Cependant, il y a encore des problèmes de modularité car on autorise une manipulation directe d'une variable. Admettons que finalement il n'est pas intelligent de stocker le total mais plutôt de le calculer chaque fois qu'on en a besoin, il faut supprimer la variable dans A, créer une méthode dans A qui calcule le total, et dans chaque fille de A faire appel à cette méthode. Ce n'est donc pas encore parfait...

      3- Accès par méthode : si la variable est privée (private double total), le seul moyen de pouvoir la lire est de demander à une méthode de A de nous en faire part. Cette méthode est dite getter. Au passage, cela permet aussi que A donne la valeur du total sans permettre une modification extérieur (même par une fille).

      La méthode se présente conventionnellement par double getTotal(). Si on rechange d'avis, et que finalement un stockage directe de la valeur est préférable à un calcul, il suffit de modifier une méthode dans une seule classe :


      public double getTotal()
      {
           return total;
      }


      au lieu de


      public double getTotal()
      {
          return (a+b)*(a+b);
      }


      A noter que, vu comme cela, on utilise finalement peu la notion d'héritage, si ce n'est pour savoir sur quel objet appeler la méthode. Si on veut que seules A et ses filles puissent lire la valeur, on peut mettre la méthode en protected.

      DONC : si je veux une bonne abstraction, et que seule A puisse changer la valeur de total, et que seules A et ses filles puissent connaître cette valeur, je programme ainsi :


      public class A
      {
           private double total;     // le total
       
           ...

           
           private void setTotal(double n) // seule A peut changer total
           {
                 total = n;
           }

           protected double getTotal()   // seule A et ses filles peuvent connaître la valeur de total
           {
               return total;
           }

           public double totalCarre()   // A peut utiliser ses propres méthodes
           {
                return getTotal() * getTotal();
           }
      }



      public class B extends A
      {
            private double c;

            ...

            public double somme()
            {
                return getTotal() + c;
            }
      }
      • Partager sur Facebook
      • Partager sur Twitter
        2 avril 2007 à 12:10:28

        çà dépend aussi de l'architecture/agencement des classes, car tu peux (peut être) aussi faire :
        public class A {
            private int a;
            private int b;
            public int somme()
            {
                return (a+b)*(a+b);
            }
        }

        public class B extends A {
            private int c;
            public int somme()
            {
                int tmp = super.somme();
                return tmp - c;
            }
        }

        • Partager sur Facebook
        • Partager sur Twitter
          2 avril 2007 à 15:16:00

          minirop : c'est exactement ce que je fais à la fin de mon message, si ce n'est que

          • je n'utilise pas pas de variable temporaire
          • mon exemple est fait sur des double
          • j'utilise des protected (pour montrer comment ca marche) plutôt que des public

          ;)

          Ah oui tu surcharges la méthode aussi, alors que je donne un nom différent pour plus de clarté.
          • Partager sur Facebook
          • Partager sur Twitter
            3 avril 2007 à 8:58:11

            Bonjour,

            Je vous remercie pour vos réponses, cela va mettre très utile

            Merci, cordialement....
            • Partager sur Facebook
            • Partager sur Twitter
              3 avril 2007 à 11:11:48

              Salut encore moi!!

              Bien, est le résultat de mon petit programme, un peu fouillis, mais sa marche, MAGNIFIQUE!!

              Merci pour les explication sa ma beaucoup aider.
              • Partager sur Facebook
              • Partager sur Twitter

              Java notion héritage

              × 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