Classes & Objets

La programmation orientée objet (POO)

Le plan et ses objets

La classe Chien est un plan. Chaque new Chien() crée un objet (une instance) avec ses propres attributs. Clique pour instancier !

classe (plan) 🐕 Chien + nom + race + aboyer() instances créées (aucun objet — clique sur le bouton)
instances : 0

Une classe = un plan • Chaque objet a ses propres valeurs d'attributs

🚀

Pourquoi la POO est partout ?

La quasi-totalité des logiciels modernes utilisent la programmation orientée objet : jeux vidéo, apps mobiles, sites web, logiciels d'entreprise, systèmes d'exploitation...

☕ Java = 100% objet 🎮 C# / Unity = objet 🐍 Python = objet 🟨 JavaScript = objet

💡 En Java, tout le code vit dans des classes ! Même le programme principal est dans une classe. C'est le langage le plus utilisé en entreprise justement grâce à cette rigueur.

⚔️ Comparaison : Sans POO vs Avec POO

Sans POO (procédural)
# Données en vrac
joueur1_nom = "Link"
joueur1_pv = 100
joueur1_attaque = 25

joueur2_nom = "Ganon"
joueur2_pv = 200
joueur2_attaque = 40

# Fonctions séparées
def attaquer(attaquant_atk, cible_pv):
    return cible_pv - attaquant_atk

# Galère si 100 joueurs...
# joueur47_pv = ???

😵 Données et fonctions séparées, difficile à maintenir

Avec POO (orienté objet)
class Personnage:
    def __init__(self, nom, pv, atk):
        self.nom = nom
        self.pv = pv
        self.attaque = atk

    def attaquer(self, cible):
        cible.pv -= self.attaque

# Créer des objets
link = Personnage("Link", 100, 25)
ganon = Personnage("Ganon", 200, 40)

link.attaquer(ganon) # Simple !

🎯 Données + comportements ensemble, réutilisable

📦
Encapsulation
Tout est groupé
♻️
Réutilisable
Créer N objets
🧬
Héritage
Étendre les classes
🔧
Maintenable
Facile à modifier

Le concept

Une classe c'est comme un moule à gâteau : elle définit la forme, mais ce n'est pas encore un gâteau.

Un objet c'est le gâteau créé à partir du moule. On peut en faire plusieurs, chacun avec ses propres décorations !

Classe (blueprint) → Objets (instances)

Classe : Voiture
Définit la structure :
marque couleur vitesse
démarrer() accélérer() freiner()
voiture1
marque = "Tesla"
couleur = "rouge"
vitesse = 120
voiture2
marque = "BMW"
couleur = "bleu"
vitesse = 80

Créateur d'objet

Crée un personnage :
class Personnage:
    ...

hero = Personnage("Link", "Guerrier", 100, 1)

Définir une classe

class Voiture:
    # Constructeur
    def __init__(self, marque, couleur):
        self.marque = marque     # Attribut
        self.couleur = couleur   # Attribut
        self.vitesse = 0         # Attribut par défaut

    # Méthode
    def accelerer(self, kmh):
        self.vitesse += kmh
        return f"Vitesse: {self.vitesse} km/h"

# Créer un objet
ma_voiture = Voiture("Tesla", "rouge")
print(ma_voiture.marque)      # "Tesla"
print(ma_voiture.accelerer(50)) # "Vitesse: 50 km/h"
class Voiture {
    // Constructeur
    constructor(marque, couleur) {
        this.marque = marque;    // Attribut
        this.couleur = couleur;  // Attribut
        this.vitesse = 0;        // Attribut par défaut
    }

    // Méthode
    accelerer(kmh) {
        this.vitesse += kmh;
        return `Vitesse: ${this.vitesse} km/h`;
    }
}

// Créer un objet
const maVoiture = new Voiture("Tesla", "rouge");
console.log(maVoiture.marque);       // "Tesla"
console.log(maVoiture.accelerer(50)); // "Vitesse: 50 km/h"
public class Voiture {
    // Attributs
    private String marque;
    private String couleur;
    private int vitesse = 0;

    // Constructeur
    public Voiture(String marque, String couleur) {
        this.marque = marque;
        this.couleur = couleur;
    }

    // Méthode
    public String accelerer(int kmh) {
        this.vitesse += kmh;
        return "Vitesse: " + vitesse + " km/h";
    }
}

// Utilisation
Voiture maVoiture = new Voiture("Tesla", "rouge");
System.out.println(maVoiture.accelerer(50));
public class Voiture {
    // Propriétés
    public string Marque { get; set; }
    public string Couleur { get; set; }
    public int Vitesse { get; private set; } = 0;

    // Constructeur
    public Voiture(string marque, string couleur) {
        Marque = marque;
        Couleur = couleur;
    }

    // Méthode
    public string Accelerer(int kmh) {
        Vitesse += kmh;
        return $"Vitesse: {Vitesse} km/h";
    }
}

// Utilisation
var maVoiture = new Voiture("Tesla", "rouge");
Console.WriteLine(maVoiture.Accelerer(50));
class Voiture {
private:
    std::string marque;
    std::string couleur;
    int vitesse = 0;

public:
    // Constructeur
    Voiture(std::string m, std::string c)
        : marque(m), couleur(c) {}

    // Méthode
    std::string accelerer(int kmh) {
        vitesse += kmh;
        return "Vitesse: " + std::to_string(vitesse) + " km/h";
    }

    std::string getMarque() { return marque; }
};

// Utilisation
Voiture maVoiture("Tesla", "rouge");
std::cout << maVoiture.accelerer(50) << std::endl;

self / this

Python : self

Premier paramètre de chaque méthode

def methode(self):
Autres : this

Mot-clé automatique

this.attribut

C'est quoi ? self / this fait référence à l'objet courant. Ca permet d'accéder aux attributs et méthodes de l'instance.

Le constructeur

Méthode spéciale appelée automatiquement à la création d'un objet

Python
__init__
JavaScript
constructor
Java/C#
NomClasse()
C++
NomClasse()
class Joueur:
    def __init__(self, nom, niveau=1):
        # Initialise les attributs
        self.nom = nom
        self.niveau = niveau
        self.pv = 100
        self.inventaire = []
        print(f"{nom} créé !")

# Le constructeur s'exécute automatiquement
hero = Joueur("Link")        # "Link créé !"
boss = Joueur("Ganon", 50)  # "Ganon créé !"
class Joueur {
    constructor(nom, niveau = 1) {
        // Initialise les attributs
        this.nom = nom;
        this.niveau = niveau;
        this.pv = 100;
        this.inventaire = [];
        console.log(`${nom} créé !`);
    }
}

// Le constructeur s'exécute automatiquement
const hero = new Joueur("Link");       // "Link créé !"
const boss = new Joueur("Ganon", 50); // "Ganon créé !"
public class Joueur {
    private String nom;
    private int niveau;
    private int pv = 100;

    // Constructeur
    public Joueur(String nom, int niveau) {
        this.nom = nom;
        this.niveau = niveau;
        System.out.println(nom + " créé !");
    }

    // Constructeur avec niveau par défaut
    public Joueur(String nom) {
        this(nom, 1);  // Appelle l'autre constructeur
    }
}

Joueur hero = new Joueur("Link");       // "Link créé !"
Joueur boss = new Joueur("Ganon", 50); // "Ganon créé !"

Méthodes

Fonctions qui appartiennent à une classe

class Joueur:
    def __init__(self, nom):
        self.nom = nom
        self.pv = 100
        self.xp = 0

    # Méthode pour subir des dégâts
    def subir_degats(self, degats):
        self.pv -= degats
        if self.pv <= 0:
            return f"{self.nom} est KO !"
        return f"{self.nom}: {self.pv} PV restants"

    # Méthode pour gagner de l'XP
    def gagner_xp(self, points):
        self.xp += points
        return f"+{points} XP ! Total: {self.xp}"

hero = Joueur("Link")
print(hero.subir_degats(30))  # "Link: 70 PV restants"
print(hero.gagner_xp(100))   # "+100 XP ! Total: 100"
class Joueur {
    constructor(nom) {
        this.nom = nom;
        this.pv = 100;
        this.xp = 0;
    }

    // Méthode pour subir des dégâts
    subirDegats(degats) {
        this.pv -= degats;
        if (this.pv <= 0) {
            return `${this.nom} est KO !`;
        }
        return `${this.nom}: ${this.pv} PV restants`;
    }

    // Méthode pour gagner de l'XP
    gagnerXp(points) {
        this.xp += points;
        return `+${points} XP ! Total: ${this.xp}`;
    }
}

const hero = new Joueur("Link");
console.log(hero.subirDegats(30));  // "Link: 70 PV restants"
console.log(hero.gagnerXp(100));   // "+100 XP ! Total: 100"

Exemple pratique : RPG

class Personnage:
    def __init__(self, nom, classe):
        self.nom = nom
        self.classe = classe
        self.pv = 100
        self.attaque = 10

    def attaquer(self, cible):
        cible.subir_degats(self.attaque)
        return f"{self.nom} attaque {cible.nom} !"

    def subir_degats(self, degats):
        self.pv = max(0, self.pv - degats)

    def est_vivant(self):
        return self.pv > 0

    def __str__(self):
        return f"{self.nom} ({self.classe}) - {self.pv} PV"

# Combat !
hero = Personnage("Link", "Guerrier")
monstre = Personnage("Goblin", "Monstre")

while hero.est_vivant() and monstre.est_vivant():
    print(hero.attaquer(monstre))
    print(monstre)
    if monstre.est_vivant():
        print(monstre.attaquer(hero))
class Personnage {
    constructor(nom, classe) {
        this.nom = nom;
        this.classe = classe;
        this.pv = 100;
        this.attaque = 10;
    }

    attaquer(cible) {
        cible.subirDegats(this.attaque);
        return `${this.nom} attaque ${cible.nom} !`;
    }

    subirDegats(degats) {
        this.pv = Math.max(0, this.pv - degats);
    }

    estVivant() {
        return this.pv > 0;
    }

    toString() {
        return `${this.nom} (${this.classe}) - ${this.pv} PV`;
    }
}

// Combat !
const hero = new Personnage("Link", "Guerrier");
const monstre = new Personnage("Goblin", "Monstre");

while (hero.estVivant() && monstre.estVivant()) {
    console.log(hero.attaquer(monstre));
    console.log(monstre.toString());
}

Ce qu'il faut retenir

Classe
Modèle/blueprint
Objet
Instance de la classe
Attribut
Variable de l'objet
Méthode
Fonction de l'objet
🎯

Quiz Mode Survie

1 erreur = Game Over
🏭

Classes & Objets

10 questions aleatoires - Mode Survie

Prog 6 Prog 8
🎬

Pour aller plus loin

Les excellentes vidéos de Graven sur les objets et classes :

Java Objets
Apprendre le Java #7 - Les Objets
Graven • ☕ Java
Python Objets
Apprendre le Python #7 - Les Objets
Graven • 🐍 Python
Glisser pour continuer vers Prog 8 : Héritage & Polymorphisme
Intermédiaire