« Ruby/Méthodes (suite) » : différence entre les versions

Contenu supprimé Contenu ajouté
Guillpetiot (discussion | contributions)
Page créée avec « À partir de maintenant, nous allons distinguer deux usages de méthodes : # Ce que nous avons vu dans la première partie, à savoir déclarer une méthode en dehors de tou... »
(Aucune différence)

Version du 18 juillet 2009 à 06:00

À partir de maintenant, nous allons distinguer deux usages de méthodes :

  1. Ce que nous avons vu dans la première partie, à savoir déclarer une méthode en dehors de toute classe. On pourra l'utiliser partout dans le fichier. Elle ne sera pas liée à un type d'objets particuliers.
  2. Ce que nous allons voir à présent, les méthodes d'instance. Elles sont définies pour tous les objets du type de cette classe (utilisables par toutes les instances). Pour les utiliser nous devons les appliquer à un objet du bon type.

Méthode d'instance

Déclaration d'une méthode d'instance

Début de l'exemple
Fin de l'exemple


Nous avons ici une classe Ordinateur. Cette classe définit deux méthodes : boot et shutdown, disponibles pour les objets de type Ordinateur. Comme vous pouvez le voir, la seule nouveauté est qu'elles sont définies à l'intérieur d'une classe (entre les mots-clés class et end).

Appel d'une méthode d'instance

Tout d'abord, instancions un objet de type Ordinateur :

Début de l'exemple
Fin de l'exemple


Les méthodes définies plus haut s'appliquent à une instance d'objet. Nous devons donc, dans notre exemple, les invoquer sur l'instance laptop en suivant le modèle : instance.méthode.

Ce qui nous donne donc :

Début de l'exemple
Fin de l'exemple


Mise à part cette nouveauté, les anciennes possibilités demeurent : vous pouvez passer des paramètres et récupérer une valeur de retour (pour l'utiliser dans une autre expression par exemple).

L'héritage

L'orientation objet de Ruby permet de faire hériter certaines classes d'autres classes. C'est là qu'intervient la notion de sous-classe. Cet exemple simple montre comment définir une classe héritant d'une super-classe :

Début de l'exemple
Fin de l'exemple


Dans la définition de la classe Ordinateur, < Machine indique que cette classe est une sous-classe de la classe Machine.


On pourrait donc enrichir notre classe Ordinateur pour lui rajouter des méthodes par rapport à sa super-classe Machine. L'héritage permet de spécialiser différemment des classes ayant un même tronc commun.


La méthode initialize


Début de l'exemple
Fin de l'exemple



La méthode initialize est presque une méthode comme les autres, elle peut prendre des paramètres, mais elle ne renvoie pas de valeur (enfin, elle renvoie une référence à l'objet instancié mais ce n'est pas exploitable).


Donc écrire self.run (à l'intérieur de la classe) équivaut à écrire monOrdi.run (à l'extérieur de la classe).


Dans d'autres langages, il y a un équivalent à la méthode initialize, ce sont des constructeurs qui portent le même nom que la classe (en Java, par exemple).


Début de l'exemple
Fin de l'exemple


Ici, la classe Enfant ne dispose pas d'une méthode initialize, on inspecte sa super-classe Parent ; elle n'en possède pas non plus, on va regarder du côté de sa super-classe GrandParent ; on appelle la méthode initialize de la classe GrandParent.

Redéfinition de méthodes



Voici par exemple deux classes : Machine et Ordinateur, la seconde héritant de la première :

Début de l'exemple
Fin de l'exemple


En invoquant la méthode run sur l'objet de type Machine, nous obtenons l'affichage produit par la méthode de la super-classe Machine. La méthode redéfinie a été appelée lorsque nous avons invoqué run sur l'objet de type Ordinateur.

Appel de méthode de super-classe

Considérons deux classes Machine et Ordinateur (sous-classe de Machine) disposant toutes deux d'une méthode run :

Début de l'exemple
Fin de l'exemple



Ici, super appelle la méthode run de la classe Machine.

Il appelle la méthode de la super-classe avec exactement les mêmes paramètres que la méthode dans laquelle il se trouve (dans notre exemple, il n'y en a aucun). Nous pouvons aussi choisir de n'en passer que quelques-uns, ou bien aucun. Dans ce dernier cas, l'appel à super doit être suivi d'une paire de parenthèses vides :

Début de l'exemple
Fin de l'exemple


Conclusion

Dans la documentation, vous trouverez des méthodes désignées comme suit :

NomClasse#Méthode

Cela vous permet de savoir sur quel type d'objet vous pouvez invoquer la méthode.

Par exemple : Integer#upto vous informe qu'il existe une méthode upto applicable à des objets de type Integer (les entiers).