Partage
  • Partager sur Facebook
  • Partager sur Twitter

héritage et transtypage

éxécution et compilation

    25 décembre 2009 à 18:14:34

    bonsoir tout le monde. J'ai une question à propos le transtypage entre classes , s'il vous plait aidez moi car dans une semaine je vais passer l'examen...

    Pour vous résumer le problème je vous donne un exemple:

    une classe perssonne, une classe jeune (héritée de personne), une classe enfant(héritée de jeune), une classe bébé (héritée d'enfant) et une classe bébéCadum (héritée de bébé).

    Supposant qu'on a déja déclaré ces classes et voici le main:
    class Test{
    public static void main (String []args ){ 
    Personne P1= new Personne();
    Personne P2=new Jeune();
    Jeune P3= new Bébé();
    Jeune P4=new BébéCadum();
    
    P1=P2;
    P4=P3;
    
    Bébé P5= (Bébé) new Personne();
    Bébé P6= (BébéCadum) new Personne();
    Bébé P7= (Jeune) new Personne();
    
    Personne P8= new Bébé();
    Jeune P9= new Enfant();
    
    P9=P8;
    
    Personne P10=new Bébé();
    BébéCadum P11= new BébéCadum();
    P11=(BébéCadum) P10;
    }
    

    Alors ma question est la suivante: pour la ligne 8,9,11,12,13,18 et 22 est-ce que c'est du "up-casting" ou "down-casting"? ça produit une erreure de compilation ou d'éxécution ? et comment on peut la corriger?
    Merci infiniment
    • Partager sur Facebook
    • Partager sur Twitter
      25 décembre 2009 à 21:39:46

      Upcasting: caster vers une classe parente. La conversion est implicite et sans danger.
      Downcasting: caster vers une classe enfant. La conversion est explicite et potentiellement dangereuse.

      En effet, tout Jeune est une Personne, mais l'inverse n'est pas toujours vrai:
      Personne p = new Jeune(); // upcasting, tout va bien
      Enfant e = (Enfant)p; // invalide, p n'est pas un Enfant, ça devrait lancer un ClassCastException
      


      En gros, si ce que tu fais n'a pas de sens, ça va planter.
      • Partager sur Facebook
      • Partager sur Twitter
        25 décembre 2009 à 23:18:11

        C'est un ptit peux plus compliqué que ce que tu dit ice_Keese, mais sur la conclusion c'est juste, ce qu'il fait va planter.
        • Partager sur Facebook
        • Partager sur Twitter
        J'ai tous les badges d'OpenClassrooms.
          26 décembre 2009 à 1:53:56

          justement c'est ça le problème. ça va planter! mais est-ce pendant la compilation ou l'exécution?^^
          D'accord je vais changer ma question peut être c'est un peu vague.
          Ce sont 2 questions en faite:

          1/Alors,si c'est du "down casting" ça plante à la compilation on est d'accord la dessus mais après forçage il peut en avoir d'erreurs d'exécutions. quand est ce que ces erreurs se produisent il?

          2/Pour la ligne 8 et 9 je ne suis pas sur qu'on peut parler du "up" ou "douwn" casting. car les 2 objets on la même référence (personne). Sinon le compilateur s'intéressera-t-il aux types d'objets cachés derrière ces références?

          Autre remarque: c'est vraiment bizarre de ne pas trouver un cour sur le transtypage entre classes :colere: . je peux enfin dire que c'est un site presque parfait ;)
          • Partager sur Facebook
          • Partager sur Twitter
            26 décembre 2009 à 17:08:12

            Une conversion explicite, c'est une patch, le genre de chose qu'on n'aurait pas à se servir dans un monde idéal. Sauf que l'on est pas dans un monde idéal. En Java, puisque tout descend ultimement d'Object, on peut upcaster et downcaster à et depuis Object sans trop de problème.

            Mais bon, caster d'une classe à une classe qui n'est ni parente ni enfante (comme de Integer à String, par exemple) provoquera une erreur à la compilation. Par contre, la plupart du temps, ça plantera à l'exécution. Et c'est pour ça qu'on privilégie l'utilisation de Generics plutôt que de foutre des Object partout.

            Sinon, il n'est pas toujours nécessaire de faire des conversions explicites. Le polymorphisme, ça marche aussi.
            • Partager sur Facebook
            • Partager sur Twitter

            héritage et transtypage

            × 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