"Qu'est-ce qu'une classe ? Une usine d'objets"
Stéphane Ducasse, research direction, Inria.
-Bonjour. Dans ce cours, on regardera ce qu'est une classe.
Une classe, en gros, c'est une usine d'objets.
Plus précisément, une classe, c'est un moule d'objets.
La grosse machine que j'ai mise sur le côté du transparent,
c'est une machine qui crée des baignoires.
Ce qu'on voit, c'est que cette machine va créer des milliers de baignoires.
Une classe, c'est pareil. Elle va créer des milliers d'objets.
Chaque objet est une entité séparée.
Ça signifie que vous pouvez, avec votre masse, casser votre baignoire.
Vous n'allez pas casser la baignoire de votre voisin, etc.
Ce qu'il faut voir, c'est qu'une classe va définir toutes les variables
qui définissent la structure de vos objets.
Par exemple, pour la baignoire, ce sera la longueur,
la profondeur, peut-être le matériau qui est utilisé.
Après, chaque baignoire va pouvoir être un peu différente.
Et une classe va aussi définir le comportement de toutes les instances.
Les classes ont été introduites
pour éviter une répétition des méthodes dans chaque instance.
Car si vous avez des milliers d'objets
et que vous devez répéter des milliers de fois la même méthode,
c'est que vous avez au moins des milliers de fois répété des choses pour rien.
Donc la classe va être le réceptacle,
l'entité qui contiendra les méthodes qui, elles, seront exécutées.
Donc, ça permettra de factoriser et d'avoir en un seul endroit
le comportement pour toutes les instances d'une classe.
Une classe va factoriser les propriétés des objets.
D'une première façon,
la classe va décrire l'état que tous les objets vont pouvoir avoir.
Elle ne va pas dire la valeur d'un état de l'objet,
mais va dire, par exemple : "Tous mes rectangles
doivent avoir une longueur et une largeur."
Et le comportement.
Ça signifie que tous mes rectangles vont devoir pouvoir calculer une aire,
les intersections, leur hauteur, ce qu'est le top et ce genre de choses.
Si on regarde... Là, j'utilise une notation UML.
Je vais avoir une classe. Que me dit cette notation ?
Elle dit que toutes mes instances vont avoir une origine et un coin
et ça me permettra de représenter mon rectangle.
Et toutes mes instances seront capables de répondre aux messages,
aire, topCorner et centre, par exemple.
Toutes les instances de la classe rectangle partageront ce comportement.
Par contre, comme on le voit sur le dessin,
chaque instance va avoir un état qui lui est propre.
Vous pouvez avoir un rectangle aplati et un gros rectangle
ou un rectangle qui serait plus sous forme de carré.
Donc, il faut bien voir que la classe va spécifier le comportement.
Elle va spécifier la structure, l'état, mais ne mettra pas les valeurs de l'état.
Chaque instance aura ses propres valeurs et par contre partagera le comportement.
C'est ce que je dis ici. Je le répète.
Une classe définit la structure et le comportement des instances,
mais les instances auront des valeurs qui leur sont spécifiques et propres.
Maintenant, regardons la différence entre une classe et des instances.
Un objet est instance d'une classe. Il a été créé par une classe.
Un objet a été créé par cette classe.
Toutes les instances d'une classe
vont réagir de la même manière aux messages définis dans la classe.
Toutes les instances de la classe vont exécuter les mêmes méthodes.
Je reviens sur le fait que toutes les instances d'une classe
partagent le même comportement.
Quand je vais envoyer un message à un objet,
je vais chercher dans la classe du receveur.
Donc, quand j'envoie un message à un rectangle,
je vais chercher dans la classe rectangle.
La méthode qui est définie dans la classe rectangle
va être exécutée avec les valeurs de l'objet qui a reçu le message.
Donc, il faut voir que les méthodes sont recherchées dynamiquement
dans la classe du receveur, de l'objet qui a reçu le message.
Les méthodes sont recherchées dynamiquement dans la classe du receveur.
Là, j'ai pris un autre exemple. J'ai pris des chiens, des chats et des poissons.
Quand j'envoie un message à un chien,
je vais chercher dans la classe du chien la méthode correspondante
et je vais exécuter cette méthode.
Par exemple, quand un chien est agressif, il aura un comportement...
Montrer des dents, aboyer, essayer de nous mordre.
Quand c'est un chat, ça va être différent.
Donc là, on voit que j'envoie un message à un objet.
Je vais chercher dans la classe de l'objet la méthode correspondante.
Donc toutes les instances de la même classe
vont partager cette même méthode.
Par contre, des instances de classes différentes
ne partageront pas les mêmes méthodes.
Elles vont les partager par leur classe.
Que devez-vous savoir ?
Vous devez savoir que tout objet dans le système est instance d'une classe.
Que la classe est une usine, qu'elle va créer des instances.
Que toutes les instances d'une classe exécutent les mêmes méthodes,
car elles les partagent.
Et qu'une classe crée des instances qui partagent le même comportement
et qu'une classe définit des méthodes
qui seront exécutées sur chacune des instances.
Maintenant, une classe va définir la structure de ces instances,
mais ne va pas définir les valeurs de ces instances.
Chaque instance aura ses propres valeurs.