Retour au cours

classes et objets : les fondations de l'orienté objet

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 Voiture dé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_rouge et votre_peugeot_bleue sont deux objets, deux instances différentes de la classe Voiture.

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 CamelCase pour 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

  1. Classe Chat :

    • Créez une classe Chat.
    • Définissez la méthode initialize pour qu’elle accepte un nom en argument et le stocke dans une variable d’instance @nom.
    • Créez une méthode d’instance parler qui affiche “Miaou, je m’appelle [nom]”.
  2. Instanciation :

    • Créez deux instances différentes de votre classe Chat, avec des noms différents.
    • Appelez la méthode parler sur chacun de vos deux chats.
  3. Ajouter de l’état :

    • Modifiez la classe Chat.
    • Ajoutez une variable d’instance @vies dans initialize, initialisée à 9.
    • Créez une méthode perdre_une_vie qui décrémente @vies de 1.
    • Créez une méthode afficher_vies qui affiche le nombre de vies restantes.
    • Testez en créant un chat, en lui faisant perdre une vie, puis en affichant ses vies restantes.