ntro.ca

        • Contrats de classe
        • Liens utiles
        • Calendrier
        • Calendrier groupe 2
        • Calendrier groupes 1, 3
        • Structure du cours
        • Évaluations
        • Matériel à se procurer
        • Les profs
          • Marc-Olivier Tremblay
          • Mathieu Bergeron
        • Module 1.1: installation + trier des cartes
        • Module 1.2: rappels POO
        • Module 1.3: tableau d'objets
        • Examen 1
        • Module 2.1: données JSON
        • Module 2.2: données en Java
        • Module 2.3: récursivité
        • Examen 2
        • Module 3.1: structure générique
        • Module 3.2: efficacité (1)
        • Module 3.3: efficacité (2)
        • Examen 3
        • Module 4.1: liste naïve
        • Module 4.2: liste par tableau
        • Module 4.3: liste chaînée
        • Examen 4
        • Module 5.1: mappage naïf
        • Module 5.2: mappage par hachage
        • Module 5.3: mappage par arbre
        • Examen 5
        • Équipes
          • Horaire groupe 1
          • Horaire groupe 2
          • Horaire groupe 3
          • Groupe 1
          • Groupe 2
          • Groupe 3
        • Projets vedettes 2022
        • Projets vedettes 2023
        • Projets vedettes 2024
        • Survol
        • Structure
        • Calendrier
        • Calendrier des séances
        • Évaluations
        • Exemples de jeu
        • Exemples de pages
        • Réponses à vos questions
        • Module 1: créer le projet
        • Module 2: concevoir l'application
        • Module 3: vues NtroFx
        • Module 4: modèle et navigation
        • Module 5: ajouter le dorsal, modifier le modèle
        • Module 7: améliorer l'affichage
        • Module 8: jeu en 2d
        • Module 9: client/serveur
        • Module 10: plusieurs instances du même modèle
        • TP1
        • Examen 1
        • TP2
        • Examen 2
        • Projet de fin de session
      • Ajout Format JSON
        • Calendrier
        • Évaluations
        • Structure du cours
        • Contrat de classe
        • Le prof
        • 01: Windows et Word
          • Astuces et raccourcis
        • 02: Word
        • 03: Word
          • Exercice Word: insertion d'éléments spéciaux
          • Exercice Word: tableaux
        • 04: Word
          • Exercice Word: références
          • TP01: Word (15%)
        • 05: PowerPoint
          • TP02: PowerPoint (10%)
        • 06: Examen Word (20%)
        • 07: Excel
        • 08: Excel
        • 09: Excel
          • TP03: Excel (15%)
        • 10: Excel
        • 11: Examen Excel (20%)
        • 12: Access
        • 13: Access
        • 14: Access
        • 15: Examen Access
      • Sondage H2023 (dept. info)
      • Vision H2023 (dept. info)
      • P1) exercices interactifs de lecture
      • P2) transition Excel vers Python
        • Atelier 2: un exemple
      • Index
      • Point de vue sur l'IA
    Théorie 1.2.5: polymorphisme
    • Théorie 1.2.5: polymorphisme
      • L’héritage veut dire est un
      • Accéder aux méthodes
      • Vérifier le type réel
      • Transtypage

    Théorie 1.2.5: polymorphisme #

    • Polymorphisme veut simplement dire plusieurs formes

    • Considérer la hiérarchie suivante:

    • Un véhicule peut prendre plusieurs formes:

      • Mobilette, Auto, Camion, etc.

    L’héritage veut dire est un #

    • Considérer la méthode suivante:
    public boolean accepterSiDeuxRoues(Vehicule vehicule) {
    	return vehicule.nombreDeRoues() == 2;
    }
    
    • Tous ces appels à la méthodes sont valides:
    accepterSiDeuxRoues(new Vehicule());
    accepterSiDeuxRoues(new DeuxRoues());
    accepterSiDeuxRoues(new Moto());
    accepterSiDeuxRoues(new Mobilette());
    
    • C’est à dire, via l’héritage et le polymorphisme:
      • un objet Vehicule est un Vehicule
      • un objet DeuxRoues est un Vehicule
      • un objet Moto est un Vehicule
      • un objet Mobilette est un Vehicule

    Accéder aux méthodes #

    • Considérer à nouveau la méthode suivante:
    public boolean accepterSiDeuxRoues(Vehicule vehicule) {
    	return vehicule.nombreDeRoues() == 2;
    
    • On peut appeler la méthode nombreDeRoues() sur l’objet vehicule

      • car cette méthode est définie dans la classe Vehicule
    • On ne pourrait pas appeler la méthode marqueDeMobilette() sur l’objet vehicule

      • car cette méthode est définie dans la classe Mobilette
    • Comme l’objet vehicule est de type Vehicule, on peut seulement accéder

      • aux méthodes définies dans la classe Vehicule
      • même si la méthode accepterSiDeuxRoues avait été appelée comme suit:
    accepterSiDeuxRoues(new Mobilette());
    
    • c-à-d même si l’objet vehicule est en réalité une Mobilette, on accède
      • aux méthodes propres au type donné dans le code

    Vérifier le type réel #

    • Considérer maintenant la méthode suivante:
    public boolean accepterSiVespa(Vehicule vehicule) {
        boolean accepter = false;
    
        if(vehicule instanceof Mobilette){
    
            accepter = true;
        }
    
        return accepter;
    }
    
    • L’opérateur instanceof vérifie le type réel de l’objet vehicule, ici:

      • retourne vrai si vehicule est en fait une Mobilette
      • retourne faux sinon
    • Mais on a toujours pas vérifié si c’est une Vespa, non?

    Transtypage #

    • Transtype (casting) veut dire changer le type

    • Pour accéder à une méthode de Mobilette il faut changer le type de vehicule

    public boolean accepterSiVespa(Vehicule vehicule) {
        boolean accepter = false;
    
        if(vehicule instanceof Mobilette){
    
            Mobilette mobilette = (Mobilette) vehicule;
    
            accepter = mobilette.marqueDeMobilette().equals("Vespa");
        }
    
        return accepter;
    }
    
    • Avant d’accéder à la méthode marqueDeMobilette on change le type vers Mobilette

    • L’opérateur est (Mobilette), ou en général: (NOUVEAU_TYPE)

    • On pourrait aussi écrire, sur une ligne:

    accepter = ((Mobilette) vehicule).marqueDeMobilette().equals("Vespa");
    
    • À noter qu’un transtypage erroné va provoquer une erreur d’exécution:
    ((Moto) vehicule).nombreDeRoues(); // si vehicule n'est pas une Moto
    ((Chat) vehicule).nombreDeRoues();
    
    Creative Commons License Creative Commons Attribution Creative Commons ShareAlike
    • Théorie 1.2.5: polymorphisme
      • L’héritage veut dire est un
      • Accéder aux méthodes
      • Vérifier le type réel
      • Transtypage