Bonjour. Dans cette séquence nous allons parler des méthodes de classe.
Alors en Pharo nous avons vu tout est un objet et qu'on
pouvait envoyer des messages et des objets.
Donc si on prend ces 2 informations-là, les classes sont
aussi des objets et on peut envoyer les informations à
des classes donc on peut envoyer des messages à des classes.
Alors 2 exemples: Time now, on envoie le message now à l'objet
Time qui est une classe, et ça nous retourne l'heure actuelle.
Donc j'envoie le message now à l'objet Time qui est un
nom de classe, qui est une classe, ça me renvoie l'heure actuelle.
De la même façon, j'envoie le message today à l'objet
Date qui est une classe, et ça me retourne la date du jour.
Voici 3 autres exemples: dans le premier, j'envoie le
message workingDirectory à la classe FileLocator, et ça
me donne le chemin d'accès en cours.
Donc le dossier dans lequel l'exécution se passe.
Dans le deuxième exemple, j'envoie le message getPng à l'objet
ZnEasy, avec en argument une url, l'url d'un fichier
png, et ça me retourne le fichier png qui est précédemment téléchargé.
Dans le troisième exemple, j'envoie le message
startDefaultOn à ZnSserver, donc qui est une classe
encore une fois, avec un numéro de port
et ceci démarre le serveur http.
Donc dans les 3 cas, on a une classe, on envoie un message à cette classe.
Alors comment est-ce qu'on fait pour implémenter une méthode de classe?
On sélectionne la classe, on appuie sur le bouton Class
pour dire qu'on veut implémenter une méthode du côté
classes et non pas du côté instances, et on implémente
une méthode comme on ferait d'habitude.
Donc là, la méthode today, elle est implémentée du côté
classes, dans la classe Date.
Alors voici sur ce slide une erreur fréquente.
Ici on souhaite envoyer le message WithValue
à la classe Counter, retourne un nouveau Counter avec une
valeur fournie en paramètre.
Donc on voudrait que counter with value
10 retourne un nouveau Counter qui commencerait à la valeur 10.
Or, si j'évalue cette expression j'obtiens la valeur
counter et pas un nouveau Counter.
En fait j'obtiens la classe et pas une nouvelle instance de cette classe.
Alors pourquoi cette erreur ?
Donc quel est le problème ?
Le problème vient que par défaut, toutes les méthodes retournent self.
Donc si je ne spécifie pas la valeur à retourner, la
méthode va retourner Self. Donc le code ci-dessus est
équivalent au code ci-dessous et donc on retourne Self.
Dans ce cas-là, Self c'est la classe Counter.
Donc la méthode retourne la classe elle-même et pas l'instance
qui a été créée juste au-dessus.
Donc pour corriger ce problème, il suffit d'
ajouter un chapeau devant le self new.
Alors en résumé, les classes sont des objets.
On peut envoyer des messages à n'importe quel objet donc
on peut envoyer un message à une classe.
Pour implémenter les méthodes correspondantes, il faut
appuyer sur le bouton Class après avoir sélectionné une classe.
La plupart des méthodes de classes servent à créer de
nouvelles instances de ces classes mais pas seulement, on
peut imaginer d'autres possibilités et vous verrez
beaucoup d'autres utilisations de la méthode de classes dans Pharo.
Les méthodes de classe sont telles qu'exactement comme
les autres méthodes, il n'y a pas de règles
particulières, le LookUp fonctionne exactement de la même façon.
Et nous verrons ça la semaine prochaine.