Objectifs
- Comprendre la différence fondamentale entre une classe (un plan) et un objet (une instance).
- Définir une classe simple avec la syntaxe
class ... end. - Créer des instances d’une classe avec la méthode
.new. - Comprendre le rôle de la méthode
initialize(le constructeur). - Définir des méthodes d’instance pour donner des comportements à vos objets.
Jusqu’à présent, nous avons utilisé des objets que Ruby nous fournit (String, Array, Integer…). La programmation orientée objet (POO) consiste à créer nos propres types d’objets.
Classe vs. Objet
C’est la distinction la plus importante en POO.
- Une Classe est un plan, un moule. Elle définit les caractéristiques (attributs) et les comportements (méthodes) qu’un certain type d’objet aura. Par exemple, la classe
Voituredéfinit qu’une voiture a une marque et une couleur, et qu’elle peut accélérer. - Un Objet (ou une instance) est une “chose” concrète, créée à partir du plan de la classe.
ma_clio_rougeetvotre_peugeot_bleuesont deux objets, deux instances différentes de la classeVoiture.
Définir une classe
On utilise le mot-clé class, suivi d’un nom qui, par convention, commence par une majuscule et utilise le CamelCase. Le bloc se termine par end.
class Voiture
# Le contenu de la classe vient ici
end
Créer un objet (une instance)
Pour créer un objet à partir de la classe, on appelle la méthode .new sur la classe.
ma_voiture = Voiture.new
une_autre_voiture = Voiture.new
puts ma_voiture.class # => Voiture
Le constructeur : initialize
La méthode initialize est une méthode spéciale. C’est le constructeur. Elle est appelée automatiquement par .new au moment de la création de l’objet. Son rôle est d’initialiser l’état de l’objet, c’est-à-dire de définir ses variables d’instance.
class Voiture
def initialize(marque, couleur)
puts "Création d'une nouvelle voiture..."
# On stocke les valeurs passées dans des variables d'instance
# pour que l'objet s'en souvienne.
@marque = marque
@couleur = couleur
end
end
# Les arguments passés à .new sont transmis à la méthode initialize
ma_clio = Voiture.new("Renault", "rouge")
# Affiche : Création d'une nouvelle voiture...
Méthodes d’instance
Ce sont les comportements de nos objets. On les définit comme des méthodes normales à l’intérieur de la classe. Elles peuvent accéder aux variables d’instance (@...) de leur propre objet.
class Voiture
def initialize(marque, couleur)
@marque = marque
@couleur = couleur
@vitesse = 0
end
# Une méthode d'instance qui modifie l'état de l'objet
def accelerer(augmentation)
@vitesse += augmentation
puts "La voiture accélère. Vitesse actuelle : #{@vitesse} km/h."
end
# Une méthode d'instance qui lit l'état de l'objet
def description
"Cette voiture est une #{@marque} de couleur #{@couleur}."
end
end
ma_clio = Voiture.new("Renault", "rouge")
puts ma_clio.description # => "Cette voiture est une Renault de couleur rouge."
ma_clio.accelerer(50) # => "La voiture accélère. Vitesse actuelle : 50 km/h."
ma_clio.accelerer(20) # => "La voiture accélère. Vitesse actuelle : 70 km/h."
Bonnes pratiques
- Respectez la convention
CamelCasepour les noms de classes. - L’état d’un objet (ses données) doit être stocké dans des variables d’instance (
@). - Le comportement d’un objet est défini par ses méthodes d’instance.
Exercices
-
Classe
Chat:- Créez une classe
Chat. - Définissez la méthode
initializepour qu’elle accepte unnomen argument et le stocke dans une variable d’instance@nom. - Créez une méthode d’instance
parlerqui affiche “Miaou, je m’appelle [nom]”.
- Créez une classe
-
Instanciation :
- Créez deux instances différentes de votre classe
Chat, avec des noms différents. - Appelez la méthode
parlersur chacun de vos deux chats.
- Créez deux instances différentes de votre classe
-
Ajouter de l’état :
- Modifiez la classe
Chat. - Ajoutez une variable d’instance
@viesdansinitialize, initialisée à 9. - Créez une méthode
perdre_une_viequi décrémente@viesde 1. - Créez une méthode
afficher_viesqui affiche le nombre de vies restantes. - Testez en créant un chat, en lui faisant perdre une vie, puis en affichant ses vies restantes.
- Modifiez la classe