Les classes et les objets
Tu sais regrouper des informations dans un enregistrement. Avec les classes, on va plus loin : on décrit un modèle, puis on fabrique autant d'objets que l'on veut d'après ce modèle.
Imagine un moule à gâteau : la classe est le moule, les objets sont les gâteaux. Tous ont la même forme, mais chacun a sa propre décoration.
Définir une classe
classe joueur:
nom est un texte
score est un nombre
vies est un nombre
fin classe
classe joueur: ouvre la définition. Les deux-points sont obligatoires.- Chaque champ est déclaré avec son type, comme une variable.
fin classe ferme le bloc.
Dans une classe, les champs ne reçoivent pas de valeur : pas de vaut entre classe et fin classe. On les remplit plus tard, sur chaque objet.
Créer des objets
On crée des objets avec est un objet, suivi du nom de la classe :
classe joueur:
nom est un texte
score est un nombre
fin classe
j1, j2 est un objet joueur
j1.nom vaut 'Alice'
j2.nom vaut 'Tom'
j1.score ajoute 50
affiche j1.nom + ' : ' + j1.score // Alice : 50
affiche j2.nom + ' : ' + j2.score // Tom : 0
Chaque objet a ses propres valeurs : ajouter des points à j1 ne change rien pour j2. Au départ, chaque champ vaut la valeur par défaut de son type.
Le type des champs est vérifié : écrire j1.score vaut 'cent' provoque une erreur, car score est un nombre.
Question : Quelle ligne crée correctement un objet de la classe voiture ? — v1 est un objet voiture. Un objet se crée toujours avec est un objet suivi du nom de la classe.
Ajouter des fonctions à une classe
Une classe peut aussi contenir des fonctions, écrites entre classe et fin classe, après les champs. Elles s'appellent à partir d'un objet, avec un point :
classe joueur:
nom est un texte
fonction saluer(prenom)
retourne 'Bonjour ' + majuscule_initiale(prenom) + ' !'
fin fonction
fin classe
j1 est un objet joueur
j1.nom vaut 'alice'
affiche j1.saluer(j1.nom) // Bonjour Alice !
Les parenthèses sont obligatoires, même sans argument : j1.afficher(). Sans elles, CoddyRun lirait un champ.
Une fonction de classe ne voit pas les champs de l'objet : il n'existe pas de mot ceci ou self. Elle travaille seulement avec ses paramètres. C'est pour ça qu'on écrit j1.saluer(j1.nom) : on lui passe le champ dont elle a besoin.
Fonction ou procédure de classe ?
Comme dans le reste du langage :
- une fonction de classe contient
retourne et s'utilise dans un calcul ou un affichage ; - une procédure de classe fait une action et se lance avec
appelle objet.nom(...).
classe compte:
titulaire est un texte
solde est un nombre
fonction euros(montant)
retourne convertir_texte(decimal(montant, 2)) + ' €'
fin fonction
procédure titre(libelle)
affiche '=== ' + libelle + ' ==='
fin procédure
fin classe
c1 est un objet compte
c1.titulaire vaut 'Léa'
c1.solde vaut 1250.5
appelle c1.titre('Compte de ' + c1.titulaire)
affiche c1.euros(c1.solde) // 1250,5 €
Une fonction de classe peut aussi s'appeler avec le nom de la classe, sans créer d'objet : compte.euros(19.5). Et pour qu'une fonction de classe en appelle une autre de la même classe, on passe aussi par le nom de la classe : compte.euros(...).
Question : Pourquoi écrit-on j1.saluer(j1.nom) et pas j1.saluer() en lisant nom dans la fonction ? — Une fonction de classe ne voit pas les champs : il faut les lui passer. La fonction de classe ne travaille qu'avec ses paramètres : on lui donne la valeur du champ en argument.
Plusieurs objets au travail
classe joueur:
nom est un texte
score est un nombre
fonction medaille(points)
si points >= 100 alors
retourne 'or'
fin si
si points >= 50 alors
retourne 'argent'
fin si
retourne 'bronze'
fin fonction
fin classe
j1, j2, j3 est un objet joueur
j1.nom vaut 'Alice'
j1.score vaut 120
j2.nom vaut 'Tom'
j2.score vaut 60
j3.nom vaut 'Sam'
j3.score vaut 20
affiche j1.nom + ' : ' + j1.medaille(j1.score)
affiche j2.nom + ' : ' + j2.medaille(j2.score)
affiche j3.nom + ' : ' + j3.medaille(j3.score)
En CoddyRun, il n'y a ni constructeur, ni héritage, ni champ privé : les classes restent simples. Deux classes différentes peuvent avoir une fonction du même nom ; c'est l'objet devant le point qui décide laquelle s'exécute.
En résumé
classe nom: ... fin classe décrit un modèle avec des champs typés.j1, j2 est un objet nom crée des objets ; chacun a ses propres valeurs.- Les fonctions et procédures de classe s'écrivent dans la classe et s'appellent avec
objet.nom(...). - Une procédure de classe se lance avec
appelle. - Une fonction de classe ne voit pas les champs : passe-les en paramètres.