Les constructeurs de classe dans Dart

-
Présentation
- Le constructeur est une méthode spéciale utilisée pour initialiser un objet lorsqu’il est créé dans le programme.
- En programmation orientée objet, lorsqu’un objet est créé, il appelle automatiquement le constructeur.
- Toutes les classes ont leur constructeur par défaut qui est créé par le compilateur lorsque la classe est appelée, de plus on peut également définir son propre constructeur.
- L’instanciation d’un objet se fait par l’appel à un constructeur. La syntaxe est la même qu’en Java.
- Le constructeur et les autres méthodes de classe présentent plusieurs différences significatives.
- Le constructeur porte le même nom que le nom de la classe.
- Le constructeur n’a pas de type de retour.
- Lorsqu’un objet est créé, le constructeur est automatiquement appelé.
- Si aucun constructeur n’est spécifié, le constructeur sans argument par défaut est utilisé.
- Par exemple, si on a un attribut « nom » dans notre classe, le paramètre devra être « this.nom ». Il n’y a alors pas besoin d’ écrire le corps de la méthode.
-
Syntaxe et utilisation
- Les constructeurs ont le même nom que le nom de la classe et n’ont pas de type de retour.
- Dans la syntaxe ci-dessus :
class_nameest le nom de la classe dont le constructeur est créé.les paramètressont des fonctionnalités facultatives et ils peuvent et ne peuvent pas être définis pour le constructeur. Le constructeur par défaut ne contient aucun paramètre défini.Le corps du constructeurest le corps du constructeur et est exécuté lorsque le constructeur est appelé, c’est-à-dire lorsqu’un objet est créé.-
Créer un constructeur dans Dart
- Tout d’abord, voyons comment écrire un constructeur de base dans dart.
- Comme nous l’avons mentionné, un constructeur a le même nom que son nom de classe et il ne renvoie aucune valeur.
- Supposons que si nous avons la classe Etudiant, le nom du constructeur doit également être Etudiant.
- Dans l’exemple ci-contre, nous avons créé une fonction constructeur Etudiant() qui est identique au nom de la classe. Nous avons passé deux paramètres dans le constructeur et lorsque nous avons instancié un objet de la classe Etudiant, il a automatiquement appeler le constructeur puis afficher le résultat.
-
Types de constructeurs dans Dart
- Il existe plusieurs types de constructeurs dans Dart, que vous pouvez utiliser pour initialiser une classe. Voici une liste des principaux types de constructeurs en Dart :
-
Constructeur par défaut
- Dart crée automatiquement un constructeur par défaut si vous n’en définissez pas explicitement un. Ce constructeur par défaut initialise les propriétés à leurs valeurs par défaut (0 pour les types numériques, null pour les types objet, etc.).
-
Syntaxe
- Le constructeur par défaut est un constructeur qui n’a aucun paramètre.
- Si vous ne déclarez pas de constructeur, un constructeur par défaut vous est fourni. Le constructeur par défaut n’a pas d’arguments et appelle le constructeur sans argument dans la superclasse (vous le comprendrez mieux dans la leçon sur le super constructeur).
-
Exemple
- Dans cet exemple, la classe Person a deux propriétés : name et age. Comme aucun constructeur n’est défini, Dart fournit automatiquement un constructeur par défaut qui initialise name à null et age à 0. Ensuite, dans la fonction main(), nous créons une instance de Person en utilisant le constructeur par défaut et initialisons ses propriétés.
-
Constructeur nommé
- Vous pouvez définir plusieurs constructeurs nommés pour une classe.
- Pour déclarer un constructeur nommé, utilisez le nom de la classe suivi de
.et du nom du constructeur. - En Dart il est possible de créer des constructeurs nommés. En principe, en Dart, il n’y a besoin que d’un seul constructeur. Cela étant dû aux possibilités offertes avec les paramètres optionnels. Cependant, il pourrait être pratique d’en posséder plusieurs et de leur donner un nom afin de rendre leur utilité très claire.
- Dans l’exemple de la classe Personne, si un troisième attribut était ajouté comme le numéro de téléphone ou bien l’adresse, il pourrait être utile d’avoir un constructeur complet, mais aussi un autre pour récupérer le nom et le prénom :
-
Constructeur paramètré
- Les constructeurs paramétrés en Dart sont des constructeurs qui acceptent des paramètres pour initialiser les propriétés de la classe.
- Le constructeur paramétré (souvent appelé constructeur génératif) est le constructeur de base en Dart. Il permet de passer des valeurs lors de la création de l’objet pour remplir ses propriétés.
- Dart a deux façons de l’écrire : la méthode « classique » (longue) et la méthode « sucre syntaxique » (recommandée).
-
La forme courte (Sucre syntaxique)
- C’est la méthode que vous utiliserez 99 % du temps. On utilise this.nom Variable directement dans les parenthèses. Dart comprend qu’il doit prendre l’argument reçu et le mettre dans la variable correspondante.
-
La forme longue (Avec liste d’initialisation)
- Avant, on devait écrire chaque étape. C’est utile si vous voulez faire une petite transformation sur la donnée avant de l’enregistrer (comme mettre une majuscule).
-
Exemple
-
Applications
-
App01
- Votre classe Car et son constructeur ici
- Votre tâche est de compléter ce code en créant la classe Car, en ajoutant le constructeur et la méthode printDetails(), puis en créant une instance de la classe Car dans la fonction main() et en appelant la méthode printDetails() sur cette instance.
- Fonction
main()avec création d’une instance -
App02
- Soit la classe Chien suivant
- Ajoutez une propriété age à la classe Chien. Modifiez les constructeurs pour inclure cette nouvelle propriété.
- Ajoutez un constructeur paramétré à la classe Chien qui prend le nom et l’âge comme paramètres.
- Ajoutez un constructeur nommé Chien.adulte qui crée un chien avec un âge par défaut de 3 ans.
-
Exercice : La Gestion de Stock « Smartphones »
- Énoncé
- Crée une classe Smartphone qui possède trois propriétés :
- String brand(la marque)
- String model (le modèle)
- int price (le prix)
- Objectifs :
- Constructeur Paramétré : Crée un constructeur qui initialise les trois propriétés d’un coup.
- Constructeur Nommé : Crée un constructeur nommé .unknown() qui initialise la marque et le modèle à « Inconnu » et le prix à 0.
- Constructeur de Redirection : Crée un constructeur nommé .promo(String brand, String model) qui initialise la marque et le modèle avec les valeurs reçues, mais fixe automatiquement le prix à 500 (en appelant le constructeur principal).
- Méthode : Ajoute une méthode info() qui affiche : « Appareil : [brand] [model], Prix : [price]€ ».
-
Exercice : Classe Produit & Constructeurs Dart
- Énoncé :
- Créer une classe Produit avec des propriétés
- nom (String)
- prix (double)
- quantiteEnStock (int)
- estDisponible (bool, calculé automatiquement : true si quantiteEnStock > 0)
- Implémenter un constructeur par défaut
- Implémenter un constructeur paramétré (avec paramètres nommés)
- Implémenter un constructeur nommé
- Utiliser les initialiseurs de liste (:) pour calculer des propriétés dérivées
- Créez une classe Produit avec les propriétés suivantes :
- nom (String)
- prix (double)
- quantiteEnStock (int)
- estDisponible (bool, calculé automatiquement : true si quantiteEnStock > 0)
- Implémentez un constructeur par défaut qui initialise un produit avec : « Inconnu », 0.0, 0, false
- Implémentez un constructeur paramétré (utilisez des paramètres nommés required) permettant de créer un produit avec des valeurs personnalisées. Calculez estDisponible automatiquement.
- Implémentez un constructeur nommé Produit.gratuit qui prend uniquement un nom, fixe le prix à 0.0 et la quantité à 10.
- Ajoutez une méthode afficher() qui imprime les informations du produit sur une seule ligne.
- Dans main(), testez les 3 constructeurs et appelez afficher() pour chacun.
class_name( [ paramètres ] ){
// Corps du constructeur
}
Les constructeurs n’ont pas de type de retour.
void main() {
// Création d'un objet
Etudiant std = new Etudiant("Ahmed", 26);
}
class Etudiant {
// Déclarer un construstor
Etudiant(String str, int age) {
print("Le nom est: ${str}");
print("L'âge est: ${age}");
}
}
class MyClass {
// Propriétés de la classe
// ...
// Constructeur par défaut (implicitement fourni par Dart)
// Vous n'avez pas besoin de le déclarer explicitement
}
class Person {
String name;
int age;
// Le constructeur par défaut est implicitement fourni par Dart
}
void main() {
// Création d'une instance de Person en utilisant le constructeur par défaut
Person person = Person();
// Accéder aux propriétés de l'objet
person.name = "Alice";
person.age = 30;
// Affichage des détails
print("Name: ${person.name}, Age: ${person.age}");
}
// Déclaration de la classe Personne
class Personne {
// Déclaration de l'attribut 'nom' (public)
String nom;
// Déclaration de l'attribut '_prenom' (privé à la bibliothèque Dart car commence par un "_")
String _prenom;
// Déclaration de l'attribut 'telephone' (public)
String telephone;
// Déclaration de l'attribut 'adresse' (public)
String adresse;
// Constructeur par défaut avec initialisation obligatoire du prénom.
// Les autres attributs sont optionnels et nommés grâce à l'utilisation des accolades.
// Exemple d'appel : Personne('Ahmed', nom: 'Ali', telephone: '1234', adresse: 'Rue X');
Personne(this._prenom, {this.nom, this.telephone, this.adresse});
// Constructeur nommé 'etatCivil' : initialise uniquement le prénom et le nom.
// Les autres champs ne sont pas pris en charge par ce constructeur.
// Exemple d'appel : Personne.etatCivil('Ahmed', 'Ali');
Personne.etatCivil(this._prenom, this.nom);
// Méthode pour afficher les informations
void afficherInfos() {
print('Nom complet : $_prenom $nom');
print('Téléphone : ${telephone ?? "non fourni"}');
print('Adresse : ${adresse ?? "non fournie"}');
}
}
//Exemple d’utilisation
void main() {
// Création d'une personne avec le constructeur principal
var personne1 = Personne('Karim', nom: 'Zitouni', telephone: '98765432', adresse: 'Nabeul');
personne1.afficherInfos();
print('---');
// Création d'une personne avec le constructeur nommé
var personne2 = Personne.etatCivil('Nadia', 'Brahimi');
personne2.afficherInfos();
print('---');
// Changer l'adresse d'une personne après sa création
personne2.adresse = 'Sousse';
personne2.telephone = '11223344';
personne2.afficherInfos();
}
Les constructeurs nommés sont utilisés lorsqu’on souhaite fournir plusieurs façons de créer un objet, chacune avec des paramètres différents ou une logique spécifique. Cela rend le code plus lisible, plus flexible et souvent plus clair pour les développeurs.
class Voiture {
String marque;
String modele;
// Constructeur paramétré raccourci
Voiture(this.marque, this.modele);
}
void main() {
var maVoiture = Voiture("Toyota", "Corolla");
}
class Voiture {
String marque;
String modele;
// On reçoit 'm' et 'mod', puis on les assigne après les ':'
Voiture(String m, String mod)
: marque = m,
modele = mod;
}
//Déclaration de la classe chat
class Chat{
String? nom;
String? couleur;
int? age;
//Constructeur basique sans paramètres #1
Chat();
//Ou
//Constructeur basique avec paramètres #2
Chat(String? nom, String? couleur, int? age){
this.nom = nom;
this.couleur = couleur;
this.age = age;
}
//Constructeur nommé avec paramètres #3
Chat.nom(String? nom){
this.nom = nom;
}
//Constructeur nommé sans paramètres #4
Chat.getInstance(){}
}
-
1. Créez une classe appelée `Car` avec les propriétés `make`, `model` et `year`.
2. Ajoutez un constructeur à la classe `Car` qui prend ces trois propriétés comme paramètres et initialise les champs correspondants.
3. Ajoutez une méthode `printDetails()` à la classe `Car` qui imprime les détails de la voiture de la manière suivante : « Make: …, Model: …, Year: … ».
4. Dans la fonction main, créez une instance de la classe `Car` en utilisant le constructeur, puis appelez la méthode `printDetails()` sur cette instance.
void main() {
// Votre code ici
}
Solution
class Car {
String make;
String model;
int year;
// Constructeur paramétré
Car(this.make, this.model, this.year);
// Méthode pour afficher les détails de la voiture
void printDetails() {
print('Make: $make, Model: $model, Year: $year');
}
}
void main() {
// Création d'une instance de Car
Car myCar = Car('Toyota', 'Corolla', 2020);
// Appel de la méthode pour afficher les détails
myCar.printDetails();
}
class Chien {
var nom;
// constructeur simple
Chien() {
this.nom = 'inconu';
}
// constructeur nommé
Chien.nom(this.nom);
}
main() {
var chien = Chien.nom('Tango');
print(chien.nom);
}
Solution
class Chien {
var nom;
var age;
Chien() {
this.nom = 'inconnu';
}
Chien.nom(this.nom);
// Nouveau constructeur nommé avec l'âge
Chien.nomEtAge(this.nom, this.age);
}
main() {
var chien1 = Chien.nom('Tango');
print(chien1.nom);
var chien2 = Chien.nomEtAge('Bella', 3);
print(chien2.nom);
print(chien2.age);
}
Solution
class Chien {
var nom;
var age;
Chien() {
this.nom = 'inconnu';
}
Chien.nom(this.nom);
Chien.nomEtAge(this.nom, this.age);
// Nouveau constructeur paramétré
Chien.parametre(this.nom, this.age);
}
main() {
var chien1 = Chien.nom('Tango');
print(chien1.nom);
var chien2 = Chien.nomEtAge('Bella', 3);
print(chien2.nom);
print(chien2.age);
var chien3 = Chien.parametre('Charlie', 2);
print(chien3.nom);
print(chien3.age);
}
Solution
class Chien {
var nom;
var age;
Chien() {
this.nom = 'inconnu';
}
Chien.nom(this.nom);
Chien.nomEtAge(this.nom, this.age);
Chien.parametre(this.nom, this.age);
// Nouveau constructeur nommé avec une logique spécifique
Chien.adulte(this.nom) {
this.age = 3;
}
}
main() {
var chien1 = Chien.nom('Tango');
print(chien1.nom);
var chien2 = Chien.nomEtAge('Bella', 3);
print(chien2.nom);
print(chien2.age);
var chien3 = Chien.parametre('Charlie', 2);
print(chien3.nom);
print(chien3.age);
var chien4 = Chien.adulte('Max');
print(chien4.nom);
print(chien4.age);
}
Solution
class Smartphone {
String brand;
String model;
int price;
// 1. Constructeur Paramétré (Le classique)
Smartphone(this.brand, this.model, this.price);
// 2. Constructeur Nommé (Pour des cas spécifiques)
Smartphone.unknown()
: brand = 'Inconnu',
model = 'Inconnu',
price = 0;
// 3. Constructeur de Redirection (Pratique pour des valeurs par défaut)
Smartphone.promo(String brand, String model) : this(brand, model, 500);
void info() {
print('Appareil : $brand $model, Prix : $price€');
}
}
void main() {
// Test du constructeur paramétré
var s1 = Smartphone('Apple', 'iPhone 15', 1000);
// Test du constructeur nommé
var s2 = Smartphone.unknown();
// Test du constructeur promo
var s3 = Smartphone.promo('Samsung', 'S23');
s1.info(); // Appareil : Apple iPhone 15, Prix : 1000€
s2.info(); // Appareil : Inconnu Inconnu, Prix : 0€
s3.info(); // Appareil : Samsung S23, Prix : 500€
}
Consignes
