Module Dart.7 – Programmation Orientée Objet
Objectif
Maîtriser la POO complète en Dart : classes, constructeurs, héritage, interfaces, mixins pour créer des architectures modulaires et maintenables.
Théorie
Classes
Définition
class Personne {
// Propriétés
String nom;
int age;
// Constructeur
Personne(this.nom, this.age);
// Méthodes
void saluer() {
print('Bonjour $nom');
}
}
Création d'objets
var jean = Personne('Jean', 30);
jean.saluer();
Constructeurs
Constructeur par défaut
Si aucun constructeur n'est défini, Dart en crée un par défaut.
class Personne {
String nom = '';
// Constructeur par défaut implicite
}
var p = Personne(); // OK
Constructeur avec initialisation
Syntaxe concise Dart.
class Personne {
String nom;
int age;
Personne(this.nom, this.age);
}
Constructeurs nommés
Plusieurs constructeurs avec des noms différents.
class Personne {
String nom;
int age;
Personne(this.nom, this.age);
Personne.anonyme() {
nom = 'Anonyme';
age = 0;
}
Personne.parDefaut() : nom = 'Inconnu', age = 0;
}
var p1 = Personne('Jean', 30);
var p2 = Personne.anonyme();
var p3 = Personne.parDefaut();
Initialisation list
Exécute du code avant le corps du constructeur.
class Personne {
String nom;
int age;
String description;
Personne(this.nom, this.age) : description = '${nom} a $age ans' {
print('Personne créée');
}
}
Encapsulation
Visibilité
Dart n'a pas de mots-clés public/private comme Java. Par convention :
- Début par
_= privé (même fichier) - Sans
_= public
class Personne {
String nom; // Public
int _age; // Privé (accessible seulement dans ce fichier)
int get age => _age;
void set age(int value) {
if (value > 0) {
_age = value;
}
}
}
Getters et Setters
class Personne {
int _age = 0;
int get age => _age;
set age(int value) {
if (value > 0 && value < 150) {
_age = value;
}
}
}
Héritage
Une classe peut hériter d'une autre classe.
Syntaxe
class Etudiant extends Personne {
String ecole;
Etudiant(String nom, int age, this.ecole) : super(nom, age);
@override
void saluer() {
super.saluer(); // Appelle la méthode parente
print('École : $ecole');
}
}
super
Référence à la classe parente.
class Etudiant extends Personne {
Etudiant(String nom, int age, String ecole) : super(nom, age) {
this.ecole = ecole;
}
}
@override
Annotation indiquant qu'on redéfinit une méthode parente.
@override
void saluer() {
// Redéfinition
}
Interfaces
En Dart, toute classe est implicitement une interface.
Implémentation explicite
abstract class Affichable {
void afficher();
}
class Personne implements Affichable {
@override
void afficher() {
print('Personne');
}
}
Plusieurs interfaces
abstract class Affichable {
void afficher();
}
abstract class Sauvegardable {
void sauvegarder();
}
class Personne implements Affichable, Sauvegardable {
@override
void afficher() {
// Implémentation
}
@override
void sauvegarder() {
// Implémentation
}
}
Abstraction
Classes abstraites
Ne peut pas être instanciée, sert de base.
abstract class Animal {
String nom;
Animal(this.nom);
// Méthode concrète
void dormir() {
print('$nom dort');
}
// Méthode abstraite (doit être implémentée)
void faireDuBruit();
}
class Chien extends Animal {
Chien(String nom) : super(nom);
@override
void faireDuBruit() {
print('Wouf !');
}
}
Mixins
Permettent de réutiliser du code entre classes sans héritage.
Définition
mixin Loggable {
void log(String message) {
print('Log: $message');
}
}
mixin Sauvegardable {
void sauvegarder() {
print('Sauvegardé');
}
}
Utilisation
class Personne with Loggable {
String nom;
Personne(this.nom);
void creer() {
log('Personne $nom créée');
}
}
class Etudiant extends Personne with Loggable, Sauvegardable {
Etudiant(String nom) : super(nom);
}
Restrictions (on)
Limiter un mixin à certaines classes.
mixin Loggable on Personne {
void log(String message) {
print('Log: $message');
}
}
class Personne {
String nom;
}
class Etudiant extends Personne with Loggable {
// OK : Etudiant extends Personne
}
Polymorphisme
Traiter différents types de manière uniforme.
List<Animal> animaux = [
Chien('Rex'),
Chat('Mimi')
];
for (Animal animal in animaux) {
animal.faireDuBruit(); // Polymorphisme
}
Exercice
-
Classes
- Créez des classes avec constructeurs
- Testez l'encapsulation avec _
- Utilisez getters/setters
-
Héritage
- Créez une hiérarchie de classes
- Testez super et @override
- Comprenez le polymorphisme
-
Interfaces
- Créez des classes abstraites
- Implémentez-les dans des classes
- Testez l'implémentation multiple
-
Mixins
- Créez des mixins réutilisables
- Utilisez-les dans plusieurs classes
- Testez les restrictions on
-
POO complète
- Créez un système avec tous les concepts
- Utilisez héritage, interfaces, mixins
- Testez le polymorphisme
Quiz
-
Comment rendre une propriété privée en Dart ?
- private
- Commencer par _ (underscore)
- protected
-
Que fait super() ?
- Crée un super objet
- Appelle le constructeur parent
- Appelle une méthode parente
-
Quelle est la différence entre extends et implements ?
- Aucune différence
- extends = héritage, implements = interface
- implements est plus rapide
-
Que sont les mixins ?
- Des classes
- Du code réutilisable sans héritage
- Des interfaces
-
Que signifie @override ?
- Crée une nouvelle méthode
- Redéfinit une méthode parente
- Supprime la méthode parente
Mini défi
Mission : Créer un système POO complet
Créez un système de gestion de bibliothèque :
Structure :
- Interface Empruntable (emprunter, retourner, estDisponible)
- Classe abstraite Document (titre, auteur)
- Classe Livre (hérite Document, implémente Empruntable)
- Classe DVD (hérite Document, implémente Empruntable)
- Mixin Loggable (log des actions)
- Classe Bibliotheque (gère collection de Documents)
Critères :
- ✅ POO complète (héritage, interfaces, mixins)
- ✅ Encapsulation appropriée
- ✅ Polymorphisme utilisé
- ✅ Code bien structuré
Objectif : Maîtriser la POO complète Dart et créer une architecture propre.
Validation : Vous pouvez passer au module suivant quand vous maîtrisez classes, héritage, interfaces, mixins et polymorphisme.