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
class Eleve
def ma_method
end
end
class Delegue < Eleve
def ma_method2
end
end
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
class Eleve
def moyenne
# ...
end
end
class Delegue < Eleve
def moyenne
18
end
end
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
class Eleve
def moyenne
# ...
end
end
class Delegue < Eleve
def moyenne
moyenne = super
moyenne + 1
end
end
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``
1.class # Fixnum
Si on regarde la documentation on remarque que cette classe hérite de Integer
qui lui même hérite de Numeric
.
1.class.superclass # Integer
1.class.superclass.superclass # Numeric
Un entier Fixnum
dispose 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
, print
ou 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.