Les Bases de la POO en C#
Programmation Orientée Objet : Concepts, Classes et Objets
1. Introduction
La Programmation Orientée Objet (POO) est un paradigme de programmation qui organise le code autour du concept d'objets plutôt que de fonctions et de logique. C'est une approche naturelle qui reflète la façon dont nous pensons au monde réel.
Pourquoi la POO ?
- ✅ Réutilisabilité : Le code peut être réutilisé dans différents contextes
- ✅ Maintenabilité : Plus facile à comprendre et à modifier
- ✅ Modularité : Le code est organisé en modules logiques
- ✅ Abstraction : Cache la complexité et montre seulement l'essentiel
2. Les Concepts Fondamentaux
Qu'est-ce qu'un Objet ?
Un objet est une entité qui combine :
- Des données (ce qu'il EST) → appelées attributs ou propriétés.
- Des comportements (ce qu'il FAIT) → appelées méthodes.
Analogie du monde réel
Prenons l'exemple d'un chien :
- Données : nom, race, âge, couleur, poids
- Comportements : aboyer(), manger(), courir(), dormir()
Qu'est-ce qu'une Classe ?
Une classe est un modèle (blueprint) qui définit la structure et le comportement des objets.
Analogie :
Analogie :
- La classe = le plan d'architecte d'une maison
- L'objet = la maison construite d'après ce plan
3. Créer sa Première Classe
Syntaxe de Base
public class NomDeLaClasse
{
// Propriétés (données)
// Constructeur (initialisation)
// Méthodes (comportements)
}
Exemple Concret : La Classe `Chien`
using System;
public class Chien
{
// ========== PROPRIÉTÉS ==========
// Ce sont les caractéristiques du chien
public string Nom { get; set; }
public string Race { get; set; }
public int Age { get; set; }
public double Poids { get; set; }
// ========== CONSTRUCTEUR ==========
// Méthode spéciale appelée lors de la création d'un objet
// Elle porte le MÊME NOM que la classe
public Chien(string nom, string race, int age, double poids)
{
Nom = nom;
Race = race;
Age = age;
Poids = poids;
}
// ========== MÉTHODES ==========
// Ce sont les actions que le chien peut faire
public void Aboyer()
{
Console.WriteLine($"{Nom} fait : Wouf wouf !");
}
public void SePresenter()
{
Console.WriteLine($"Je m'appelle {Nom}, je suis un {Race} de {Age} ans.");
}
public void Manger(string nourriture)
{
Console.WriteLine($"{Nom} mange {nourriture}.");
Poids += 0.1; // Le chien prend un peu de poids
}
public void Vieillir()
{
Age++;
Console.WriteLine($"{Nom} a maintenant {Age} ans.");
}
}
Explications
- `public class Chien` : Définit le modèle.
- Propriétés : `Nom`, `Race`, `Age`, `Poids` définissent l'état de l'objet.
- Constructeur : `public Chien(...)` permet d'initialiser les propriétés lors de la création.
- Méthodes : `Aboyer`, `SePresenter` définissent le comportement.
4. Utiliser la Classe (Créer des Objets)
Une fois la classe définie, on peut créer des instances (des objets spécifiques) dans le programme principal.
public class Program
{
public static void Main()
{
// Créer un premier chien
Chien monChien = new Chien("Rex", "Berger Allemand", 3, 25.5);
// Utiliser les méthodes
monChien.SePresenter(); // Affiche: Je m'appelle Rex, je suis un Berger Allemand de 3 ans.
monChien.Aboyer(); // Affiche: Rex fait : Wouf wouf !
monChien.Manger("des croquettes"); // Affiche: Rex mange des croquettes.
// Accéder aux propriétés
Console.WriteLine($"Poids de {monChien.Nom} : {monChien.Poids} kg");
// Créer un deuxième chien (même classe, objet différent)
Chien autreChien = new Chien("Bella", "Labrador", 5, 28.0);
autreChien.SePresenter();
autreChien.Aboyer();
// Les deux chiens sont INDÉPENDANTS
monChien.Vieillir(); // Rex vieillit
Console.WriteLine($"Âge de Bella : {autreChien.Age}"); // Bella n'a pas vieilli !
}
}
5. Les Propriétés en C#
Propriétés Auto-implémentées
public string Nom { get; set; }
C'est la syntaxe la plus simple. C# crée automatiquement une variable privée en arrière-plan.
- `get` : permet de lire la valeur.
- `set` : permet de modifier la valeur.
Contrôler l'Accès
public class CompteBancaire
{
// Lecture publique, modification privée
public double Solde { get; private set; }
// Propriété en lecture seule (pas de set)
public string NumeroCompte { get; }
public CompteBancaire(string numero, double soldeInitial)
{
NumeroCompte = numero; // On peut initialiser dans le constructeur
Solde = soldeInitial;
}
public void Deposer(double montant)
{
if (montant > 0)
{
Solde += montant;
Console.WriteLine($"Dépôt de {montant}€. Nouveau solde : {Solde}€");
}
}
}
Propriétés avec Validation (Full Properties)
Parfois, on veut valider les valeurs avant de les accepter.
public class Personne
{
private int _age; // Variable privée (backing field)
public int Age
{
get { return _age; }
set
{
if (value >= 0 && value <= 150) _age = value;
else Console.WriteLine("Âge invalide !");
}
}
}
6. Les Constructeurs
Constructeur par Défaut
Si vous ne définissez AUCUN constructeur, C# en crée un automatiquement (vide).
public class Point
{
public int X { get; set; }
public int Y { get; set; }
// public Point() { } // Créé automatiquement
}
Surcharge de Constructeurs
public class Rectangle
{
public int Largeur { get; set; }
public int Hauteur { get; set; }
// Constructeur 1 : avec paramètres
public Rectangle(int largeur, int hauteur)
{
Largeur = largeur;
Hauteur = hauteur;
}
// Constructeur 2 : pour un carré
public Rectangle(int cote)
{
Largeur = cote;
Hauteur = cote;
}
}
7. Les Méthodes
Types de Méthodes
- `void` : La méthode effectue une action mais ne retourne rien.
- Type (int, string, ...) : La méthode retourne un résultat.
public class Calculatrice
{
public int Additionner(int a, int b)
{
return a + b;
}
}
Surcharge (Overloading)
Même nom, paramètres différents.
public class Afficheur
{
public void Afficher(int nombre) { ... }
public void Afficher(string texte) { ... }
}
8. Les Piliers de la POO
L'Encapsulation
Définition
Cacher les détails internes et exposer seulement ce qui est nécessaire.
Modificateurs d'accès :
- `public` : Accessible de partout.
- `private` : Accessible seulement dans la classe.
- `protected` : Accessible dans la classe et ses classes dérivées.
L'Héritage
Définition
Une classe peut hériter des propriétés et méthodes d'une autre classe.
// CLASSE MÈRE
public class Animal
{
public string Nom { get; set; }
public Animal(string nom) { Nom = nom; }
public void Manger() { Console.WriteLine($"{Nom} mange."); }
}
// CLASSE FILLE
public class Chien : Animal // ":" signifie "hérite de"
{
public string Race { get; set; }
// "base" appelle le constructeur de la classe mère
public Chien(string nom, string race) : base(nom)
{
Race = race;
}
public void Aboyer() { Console.WriteLine("Wouf !"); }
}