Section 13.2.1 : Héritage et modules Ruby
🎯 Objectif pédagogique
Comprendre l'héritage de classes et les modules Mixin en Ruby pour structurer du code réutilisable et bien organisé. Ces concepts sont fondamentaux pour comprendre Ruby on Rails.
L'héritage : spécialiser des classes
L'héritage permet de créer une classe enfant qui hérite de toutes les propriétés et méthodes d'une classe parent, tout en ajoutant ses spécificités. En Ruby, chaque classe ne peut hériter que d'une seule classe parent (héritage simple).
class Animal
attr_reader :nom, :age
def initialize(nom, age)
@nom = nom
@age = age
end
def parler
'...'
end
def presenter
"Je suis #{@nom}, j'ai #{@age} ans"
end
end
class Chien < Animal
def parler
'Woof!'
end
def fetch(objet)
"#{@nom} rapporte #{objet}"
end
end
class Chat < Animal
def parler
'Miaou!'
end
def ronronner
"#{@nom} ronronne..."
end
end
rex = Chien.new('Rex', 3)
puts rex.presenter # Hérité du parent
puts rex.parler # Surchargé
puts rex.fetch('balle') # Spécifique au Chien
Le mot-clé super
super appelle la méthode du même nom dans la classe parent :
class Vehicule
attr_reader :marque, :modele
def initialize(marque, modele)
@marque = marque
@modele = modele
@kilometrage = 0
end
def info
"#{@marque} #{@modele} - #{@kilometrage} km"
end
end
class VehiculeElectrique < Vehicule
def initialize(marque, modele, autonomie)
super(marque, modele)
@autonomie = autonomie
@batterie = 100
end
def info
"#{super} | Batterie: #{@batterie}% | Autonomie: #{@autonomie} km"
end
end
tesla = VehiculeElectrique.new('Tesla', 'Model 3', 560)
puts tesla.info
Les modules : Mixins pour la réutilisation
Ruby n'a pas d'héritage multiple, mais les modules (Mixins) permettent de partager du comportement entre classes non liées.
module Affichable
def afficher
puts to_s
end
end
module Validable
def valide?
erreurs.empty?
end
def erreurs
[]
end
end
class Produit
include Affichable
include Validable
attr_accessor :nom, :prix
def initialize(nom, prix)
@nom = nom
@prix = prix
end
def to_s
"#{@nom} - #{@prix} EUR"
end
def erreurs
errs = []
errs << 'Nom requis' if @nom.nil? || @nom.empty?
errs << 'Prix positif requis' if @prix.nil? || @prix <= 0
errs
end
end
p = Produit.new('MacBook Pro', 2399)
p.afficher # De Affichable
p.valide? # De Validable
Comparable et Enumerable
class Etudiant
include Comparable
attr_accessor :nom, :moyenne
def initialize(nom, moyenne)
@nom = nom
@moyenne = moyenne
end
def <=>(other)
@moyenne <=> other.moyenne
end
end
etudiants = [
Etudiant.new('Alice', 16.5),
Etudiant.new('Bob', 14.2),
Etudiant.new('Charlie', 18.0)
]
etudiants.sort.map(&:nom) # ['Bob', 'Alice', 'Charlie']
etudiants.max.nom # 'Charlie'
Héritage vs Modules
← Scroll horizontally →
Quelle est la différence entre include et extend en Ruby ?
Apprendre l’IA, du premier prompt aux agents