Nous avons vu dans le chapitre précédent comment créer des classes pour définir des nouveaux concepts au sein de notre application. Mais parfois, certains de nos concepts vont partager beaucoup de méthode et redéfinir toutes les méthodes à chaque fois ne serait pas efficace. On peut alors utiliser le principe d'héritage. Ce principe permet de créer une classe qui va hériter d'une classe parente. Elle récupèrera alors toutes les méthodes de la classe parente.
Syntaxe
Pour créer une classe qui hérite d'une autre en Ruby il suffit d'utiliser le symbole <suivi du nom de la classe à hériter
La classe Delegue hérite de la classe Eleve et possèdera donc une méthode d'instance ma_method qui sera hérité, et une méthode ma_methode2.
Réécrire une méthode
Une classe enfant peut réécrire une méthode de la classe parente afin d'en modifier son comportement
La méthode d'instance moyenne est ici modifié et renverra 18 quoi qu'il arrive. Si on définit une méthode de même nom dans une classe enfant, on écrase celle définie par le parent
Modifier une méthode
Si on reprend notre exemple précédent, que se passe-t-il si je souhaite réécrire la méthode tout en appellant la méthode parente ? Par exemple, ajouter 1 à la moyenne de l'élève
super permet d'appeller la méthode parente depuis un enfant. Si vous ne précisez aucun argument, alors la méthode parente sera appellée avec les mêmes arguments.
L'héritage dans le core
Si on analyse le fonctionnement du core de Ruby on remarque que la class d'un entier est `Fixnum``
Si on regarde la documentation on remarque que cette classe hérite de Integer qui lui même hérite de Numeric.
Un entier Fixnumdispose donc de toutes les méthodes de la classe Fixnum et des méthodes parentes. Ainsi, dans de nombreux cas, les objets de base de Ruby utilisent déjà ce système d'héritage et il est important de le comprendre afin d'être capable de trouver les méthodes qu'il est possible d'utiliser.
La class Object
Il est important de noter que toutes les classes que l'on va créer dans Ruby hériteront de la classe Object. C'est cette classe qui contient des méthodes telles que puts, printou autre. Cet héritage se fait de manière implicite et il n'est pas nécessaire de le préciser quand on crée une nouvelle classe.