Introduction à la programmation orientée objet en Dart
Introduction à la programmation orientée objet en Dart
Sommaire
- 1- Objectifs
- 2- Notion de POO en Dart
- 3- Présentation
- 4- Classes et Objets en Dart
- 4.1- Qu'est ce qu'une classe?
- 4.1.1- Syntaxe d'une classe Dart
- 4.1.2- Explications :
- 4.2- Qu'est ce qu'un Objets?
- 4.2.1- Exemple
- 5- Instanciation
- 6- Activités:
- 6.1- Activité 1 :
- 6.2- Activité 2 :
- 6.3- Activité 3 :
- 6.4- Activité 4 :
- 6.5- Activité 5 :
- 7- Encapsulation
- 7.1- Champs Privés :
- 7.2- Accès Contrôlé :
- 7.3- Protection contre la Modification Directe :
- 7.4- Modification de l'Implémentation sans Impact Extérieur :
- 8- Héritage
- 8.1- Déclaration d'une Classe avec Héritage :
- 8.2- Appel à la Classe de Base avec super :
- 8.3- Surcharge de Méthodes (Override) :
- 8.4- Constructeurs dans les Classes Dérivées :
- 8.5- Utilisation de l'Héritage pour la Réutilisation du Code :
- 9- Polymorphisme
- 9.1- Polymorphisme de sous-typage (Polymorphisme d'héritage):
- 9.2- Polymorphisme d'interface:
- 9.3- Activité
- 10- Applications
- 10.1- App01
- 10.1.1- Enoncé
- 10.1.2- Solution
- 10.1.3- Cours Dart
-
Objectifs
- Ce familiariser avec les concepts fondamentaux de la programmation orientée objet (POO) tout en utilisant le langage de programmation Dart. .
-
Notion de POO en Dart
- La programmation orientée objet, ou POO, est un paradigme de programmation qui permet de structurer les programmes de manière à ce que les propriétés et les comportements soient regroupés dans des objets à part.
- Par exemple, un objet peut représenter une personne avec un nom, un âge, une adresse, etc., avec des comportements tels que marcher, parler, respirer et courir.
- En d’autres termes, la programmation orientée objet est une approche permettant de modéliser des éléments concrets du monde réel tels que les voitures les personnes…, ainsi que des relations entre des entités telles que les entreprises et les employés, les étudiants et les enseignants, etc.
- La modélisation POO modélise des entités réelles sous la forme d’objets logiciels certaines données qui leur sont associées et peuvent remplir certaines fonctions.
-
Présentation
- La programmation orientée objet (POO) est une méthode de structuration d’un programme en regroupant des propriétés et des comportements associés dans des objets individuels.
- Dart est un langage de programmation orienté objet et prend en charge tous les concepts de la programmation orientée objet tels que les classes, l’objet,l’Encapsulation, l’héritage, le polymorphisme, les interfaces et les classes abstraites. .
-
Classes et Objets en Dart
-
Qu’est ce qu’une classe?
- Une classe est un modèle ou un plan pour créer des objets. Elle définit les propriétés et les comportements des objets qui en sont instanciés.
- Une classe peut contenir des variables (appelées propriétés ou champs) pour stocker des données et des fonctions (appelées méthodes) pour définir le comportement de ces données.
- Les classes peuvent également hériter des propriétés et des comportements d’autres classes, ce qui favorise la réutilisation du code et la structuration hiérarchique des données.
- Dart est un langage orienté objet, il intègre donc la notion de classe. La syntaxe est similaire à celle de Java mais Dart propose quelques fonctionnalités en plus comme les constructeurs nommés ou encore la surcharge d’opérateur. Toutes les classes héritent de la classe Object.
- Une classe a des propriétés et des méthodes.
- propriété signifie, par exemple, qu’une voiture aura des couleurs, Combien y aura-t-il de places ?
- La méthode est de savoir comment conduire la voiture. Si vous tournez, comment devriez-vous tourner ? Des méthodes telles que comment freiner.
-
Syntaxe d’une classe Dart
- La syntaxe de la classe est donnée ci-dessous.
-
Explications :
class MaClasse { ... }:
Déclare une classe nommée MaClasse.TypeDeDonnee nomDuChamp1; TypeDeDonnee nomDuChamp2;:
Déclare deux champs (ou propriétés) de la classe, nomDuChamp1 et nomDuChamp2, de type TypeDeDonnee.MaClasse(param1, param2, /* ... */) { ... }:
Déclare un constructeur pour la classe MaClasse qui prend des paramètres param1, param2, etc., et initialise les champs de la classe avec ces valeurs.this.nomDuChamp1 = param1; this.nomDuChamp2 = param2;:
Initialise les champs de la classe avec les valeurs des paramètres du constructeur.TypeDeRetour nomDeLaMethode1(TypeDeParametre1 param1, /* ... */) { ... }:
Déclare une méthode nommée nomDeLaMethode1 avec un type de retour TypeDeRetour et un paramètre param1 de type TypeDeParametre1.-
TypeDeRetour nomDeLaMethode2(TypeDeParametre2 param2, /* ... */) { ... }:
Déclare une autre méthode nommée nomDeLaMethode2 avec un type de retour TypeDeRetour et un paramètre param2 de type TypeDeParametre2. // ...:
Cela représente une indication qu’il peut y avoir plus de champs, de constructeurs ou de méthodes dans la classe, mais ils ne sont pas spécifiés dans cet exemple.-
Qu’est ce qu’un Objets?
- Un objet est une unité de base de la programmation orientée objet et représente les entités de la vie réelle.
- Un objet est une instance d’une classe. C’est une entité concrète qui occupe de la mémoire et qui peut être manipulée dans le programme.
- Lorsqu’une classe est instanciée, elle crée un objet qui hérite des propriétés et des comportements définis dans la classe.
- Chaque objet instancié à partir d’une classe particulière peut avoir ses propres valeurs pour les propriétés de cette classe, mais il partage les mêmes méthodes définies dans la classe.
- Pour créer un objet en Dart, vous devez d’abord définir une classe. Une classe est un plan ou un modèle pour créer des objets.
- Un objet est une instance spécifique d’une classe, contenant des valeurs réelles pour les attributs définis par la classe et pouvant exécuter les méthodes qui y sont spécifiées. C’est comme un exemplaire individuel créé à partir du plan fourni par la classe.
-
Exemple
- Dans cet exemple, la classe « Voiture » a trois propriétés (modele, marque et annee) et une méthode (afficherDetails()) qui affiche les détails de la voiture.
- Pour créer un objet à partir de cette classe « Voiture« , vous pouvez utiliser le mot-clé new suivi du nom de la classe et des parenthèses pour appeler son constructeur par défaut, comme ceci :
- Maintenant, vous pouvez définir les propriétés de l’objet voiture et utiliser la méthode afficherDetails() pour afficher les détails de la voiture, par exemple :
voiture.marque = "Toyota"; voiture.modele = "Corolla"; voiture.annee = 2022; voiture.afficherDetails();
-
Instanciation
- En programmation orientée objet (POO), l’instanciation est le processus de création d’un objet spécifique (une instance) à partir d’une classe. En d’autres termes, c’est lorsqu’un objet est créé en utilisant une classe comme modèle ou comme plan pour définir ses caractéristiques et ses comportements.
- En Dart, pour instancier un objet, vous utilisez le mot-clé
new
suivi du nom de la classe et des parenthèses()
pour appeler le constructeur de la classe. - Par exemple, supposons que vous ayez une classe Personne :
- Pour instancier un objet personne à partir de cette classe, vous pouvez faire ce qui suit :
- ou simplement :
- Une fois que vous avez instancié l’objet personne, vous pouvez accéder à ses propriétés et à ses méthodes en utilisant la notation du point .. Par exemple, vous pouvez définir la valeur de la propriété nom de l’objet personne :
- Et vous pouvez appeler la méthode direBonjour() de l’objet personne :
-
Activités:
-
Activité 1 :
- Créez une classe « Rectangle » avec des propriétés pour la longueur et la largeur.
- Ajoutez une méthode pour calculer l’aire du rectangle.
- Instanciez un objet « rectangle » avec une longueur de 5 et une largeur de 3, puis affichez son aire.
-
Activité 2 :
- Créez une classe « Etudiant » avec des propriétés pour le nom, l’âge et le niveau d’étude.
- Ajoutez une méthode pour afficher les informations de l’étudiant. Instanciez un objet « etudiant » avec les valeurs de votre choix, puis appelez la méthode pour afficher les informations.
-
Activité 3 :
- Créez une classe « Produit » avec des propriétés pour le nom, le prix et la quantité en stock.
- Ajoutez des méthodes pour augmenter et diminuer la quantité en stock.
- Instanciez un objet « produit » avec un nom, un prix et une quantité initiale, puis appelez les méthodes pour augmenter et diminuer la quantité en stock.
- Affichez la quantité mise à jour.
-
Activité 4 :
- Créez une classe « Chien » avec des propriétés pour le nom et l’âge.
- Ajoutez une méthode pour faire aboyer le chien, qui affiche « Le chien [nom] aboie !«
- Instanciez un objet « chien » avec un nom et un âge, puis appelez la méthode pour faire aboyer le chien.
-
Activité 5 :
- Créez une classe « CompteBancaire » avec des propriétés pour le nom du titulaire et le solde.
- Ajoutez des méthodes pour déposer et retirer de l’argent du compte.
- Instanciez un objet « compte » avec un nom de titulaire et un solde initial, puis appelez les méthodes de dépôt et de retrait pour effectuer des transactions. Affichez le solde mis à jour.
-
Encapsulation
- L’encapsulation est l’un des quatre principes fondamentaux de la programmation orientée objet (POO), aux côtés de l’héritage, du polymorphisme et de l’abstraction.
- En Dart, l’encapsulation est la pratique de regrouper les données (les champs ou propriétés) et les méthodes qui les manipulent au sein d’une même unité, généralement une classe.
- L’objectif principal de l’encapsulation est de cacher l’implémentation interne de la classe et de fournir un accès contrôlé aux données.
- Voici quelques aspects clés de l’encapsulation en Dart :
-
Champs Privés :
- En Dart, l’encapsulation est souvent mise en œuvre en déclarant les champs comme privés en les préfixant d’un underscore
_
. - Ces champs privés ne sont pas accessibles directement depuis l’extérieur de la classe.
-
Accès Contrôlé :
- Pour permettre l’accès aux données encapsulées, des méthodes publiques (getters et setters) sont souvent définies.
- Ces méthodes permettent un accès contrôlé aux données internes de la classe, permettant la validation ou la modification des valeurs avant ou après leur accès.
-
Protection contre la Modification Directe :
- L’encapsulation protège contre la modification directe des champs privés en dehors de la classe, réduisant ainsi le risque d’erreurs et facilitant la maintenance du code.
-
Modification de l’Implémentation sans Impact Extérieur :
- En encapsulant les détails internes de la classe, vous pouvez changer l’implémentation sans affecter le reste du programme. Tant que les méthodes publiques restent inchangées, le code client n’a pas besoin d’être modifié.
class MaClasse {
// Champs (propriétés)
TypeDeDonnee nomDuChamp1;
TypeDeDonnee nomDuChamp2;
// ...
// Constructeur
MaClasse(param1, param2, /* ... */) {
// Initialisation des champs
this.nomDuChamp1 = param1;
this.nomDuChamp2 = param2;
// ...
}
// Méthodes
TypeDeRetour nomDeLaMethode1(TypeDeParametre1 param1, /* ... */) {
// Corps de la méthode
// ...
}
TypeDeRetour nomDeLaMethode2(TypeDeParametre2 param2, /* ... */) {
// Corps de la méthode
// ...
}
// ...
}
class Voiture {
String modele;
String marque;
int annee;
void afficherDetails() {
print("Marque : $marque");
print("Modèle : $modele");
print("Année : $annee");
}
}
class Personne {
String nom;
int age;
void direBonjour() {
print("Bonjour, je m'appelle $nom et j'ai $age ans.");
}
}
Personne personne = new Personne();
var personne = new Personne();
personne.nom = "John Doe";
personne.direBonjour(); // Affiche "Bonjour, je m'appelle John Doe et j'ai ... ans."
Solution
// Définition de la classe Rectangle
class Rectangle {
// Propriétés de la classe
double longueur;
double largeur;
// Constructeur de la classe
Rectangle(this.longueur, this.largeur);
// Méthode pour calculer l'aire du rectangle
double calculerAire() {
return longueur * largeur;
}
}
// Fonction principale
void main() {
// Instanciation d'un objet de la classe Rectangle avec une longueur de 5 et une largeur de 3
Rectangle rectangle = Rectangle(5, 3);
// Appel de la méthode calculerAire() pour obtenir l'aire du rectangle
double aire = rectangle.calculerAire();
// Affichage du résultat
print("L'aire du rectangle est : $aire");
}
Solution
// Définition de la classe Etudiant
class Etudiant {
// Propriétés de la classe
String nom; // Nom de l'étudiant
int age; // Âge de l'étudiant
String niveauEtude; // Niveau d'étude de l'étudiant
// Constructeur de la classe Etudiant
Etudiant(this.nom, this.age, this.niveauEtude);
// Méthode pour afficher les informations de l'étudiant
void afficherInformations() {
print("Nom: $nom, Age: $age, Niveau d'étude: $niveauEtude");
}
}
// Fonction principale
void main() {
// Instanciation d'un objet de la classe Etudiant avec des valeurs initiales
Etudiant etudiant = Etudiant("Jean", 20, "Universitaire");
// Appel de la méthode afficherInformations() pour afficher les informations de l'étudiant
etudiant.afficherInformations();
}
Solution
// Définition de la classe Produit
class Produit {
// Propriétés de la classe
String nom; // Nom du produit
double prix; // Prix du produit
int quantiteStock; // Quantité en stock du produit
// Constructeur de la classe Produit
Produit(this.nom, this.prix, this.quantiteStock);
// Méthode pour augmenter la quantité en stock du produit
void augmenterQuantite(int quantite) {
quantiteStock += quantite; // Incrémentation de la quantité en stock
}
// Méthode pour diminuer la quantité en stock du produit
void diminuerQuantite(int quantite) {
quantiteStock -= quantite; // Décrémentation de la quantité en stock
}
}
// Fonction principale
void main() {
// Instanciation d'un objet de la classe Produit avec des valeurs initiales
Produit produit = Produit("Ordinateur", 1000, 10);
// Affichage de la quantité initiale en stock du produit
print("Quantité initiale en stock: ${produit.quantiteStock}");
// Augmentation de la quantité en stock du produit et affichage de la nouvelle quantité
produit.augmenterQuantite(5);
print("Quantité après augmentation: ${produit.quantiteStock}");
// Diminution de la quantité en stock du produit et affichage de la nouvelle quantité
produit.diminuerQuantite(3);
print("Quantité après diminution: ${produit.quantiteStock}");
}
Solution
// Définition de la classe Chien
class Chien {
// Propriétés de la classe
String nom; // Nom du chien
int age; // Âge du chien
// Constructeur de la classe Chien
Chien(this.nom, this.age);
// Méthode pour faire aboyer le chien
void aboyer() {
print("Le chien $nom aboie !"); // Affiche un message avec le nom du chien
}
}
// Fonction principale
void main() {
// Instanciation d'un objet de la classe Chien avec des valeurs initiales
Chien chien = Chien("Rex", 3);
// Appel de la méthode aboyer() sur l'objet chien
chien.aboyer(); // Affiche "Le chien Rex aboie !"
}
Solution
// Définition de la classe CompteBancaire
class CompteBancaire {
// Propriétés de la classe
String nomTitulaire; // Nom du titulaire du compte
double solde; // Solde du compte
// Constructeur de la classe CompteBancaire
CompteBancaire(this.nomTitulaire, this.solde);
// Méthode pour déposer de l'argent sur le compte
void deposerArgent(double montant) {
solde += montant; // Ajoute le montant déposé au solde actuel
}
// Méthode pour retirer de l'argent du compte
void retirerArgent(double montant) {
solde -= montant; // Soustrait le montant retiré au solde actuel
}
}
// Fonction principale
void main() {
// Instanciation d'un objet de la classe CompteBancaire avec des valeurs initiales
CompteBancaire compte = CompteBancaire("Jean", 1000);
// Affichage du solde initial du compte
print("Solde initial: ${compte.solde}");
// Dépôt de 500 unités d'argent sur le compte et affichage du solde mis à jour
compte.deposerArgent(500);
print("Solde après dépôt: ${compte.solde}");
// Retrait de 200 unités d'argent du compte et affichage du solde mis à jour
compte.retirerArgent(200);
print("Solde après retrait: ${compte.solde}");
}
class Person {
String _name; // Champ privé
int _age; // Champ privé
Person(this._name, this._age);
}
class Person {
String _name; // Champ privé
int _age; // Champ privé
Person(this._name, this._age);
// Getter
String get name => _name;
// Setter
set age(int value) {
if (value >= 0) {
_age = value;
} else {
print('L\'âge ne peut pas être négatif.');
}
}
}
En résumé, l’encapsulation en Dart favorise la modularité, la réutilisation du code et la réduction des erreurs en restreignant l’accès direct aux détails internes de la classe. Elle encourage la définition d’interfaces publiques bien définies pour interagir avec les objets plutôt que de manipuler directement leurs états internes.
Héritage
- L’héritage est l’un des principes fondamentaux de la programmation orientée objet (POO) qui permet à une classe (appelée classe dérivée ou sous-classe) de hériter des propriétés et des comportements d’une autre classe (appelée classe de base ou superclasse). En Dart, l’héritage est pris en charge, et voici les principaux concepts à connaître :
-
Déclaration d’une Classe avec Héritage :
- En Dart, pour déclarer une classe qui hérite d’une autre, on utilise le mot-clé extends.
- Dans cet exemple, la classe Employee hérite de la classe Person. La classe Employee a donc accès aux propriétés et méthodes de la classe Person, en plus de ses propres membres.
class Person {
String name;
int age;
Person(this.name, this.age);
void printInfo() {
print('Nom: $name, Âge: $age');
}
}
class Employee extends Person {
String department;
Employee(String name, int age, this.department) : super(name, age);
void printEmployeeInfo() {
super.printInfo(); // Appel à la méthode de la classe de base
print('Département: $department');
}
}
Appel à la Classe de Base avec super :
- Le mot-clé super est utilisé pour appeler les membres (méthodes ou propriétés) de la classe de base à partir de la classe dérivée.
void printEmployeeInfo() {
super.printInfo(); // Appel à la méthode printInfo() de la classe de base
print('Département: $department');
}
Surcharge de Méthodes (Override) :
- Une classe dérivée peut redéfinir (ou surcharger) une méthode de la classe de base en utilisant le mot-clé @override.
@override
void printInfo() {
print('Employé - Nom: $name, Âge: $age');
}
Constructeurs dans les Classes Dérivées :
- Les classes dérivées peuvent appeler le constructeur de la classe de base en utilisant super dans leur propre constructeur.
Employee(String name, int age, this.department) : super(name, age);
Utilisation de l’Héritage pour la Réutilisation du Code :
- L’héritage permet de réutiliser le code en évitant la duplication. Les membres communs à plusieurs classes peuvent être placés dans une classe de base, tandis que les classes dérivées peuvent se concentrer sur leurs spécificités.
void main() {
Employee employee = Employee('Alice', 30, 'Informatique');
employee.printEmployeeInfo();
}
Polymorphisme
- En Dart, le polymorphisme se réfère à la capacité d’un objet à prendre différentes formes, généralement en utilisant l’héritage et les interfaces.
- Il existe deux types principaux de polymorphisme en Dart : le polymorphisme de sous-typage (ou polymorphisme d’héritage) et le polymorphisme d’interface.
-
Polymorphisme de sous-typage (Polymorphisme d’héritage):
- Le polymorphisme de sous-typage est basé sur l’héritage. Dart prend en charge l’héritage simple, et les classes peuvent hériter d’une seule classe à la fois.
- Voici un exemple simple de polymorphisme de sous-typage en Dart :
- Dans cet exemple, la classe Animal est la classe de base, et les classes Chien et Chat héritent de la classe Animal. Les méthodes spécifiques de chaque classe dérivée (chien et chat) peuvent être appelées via une référence de type Animal.
class Animal {
void faireDuBruit() {
print('Certains animaux font du bruit.');
}
}
class Chien extends Animal {
@override
void faireDuBruit() {
print('Le chien aboie.');
}
}
class Chat extends Animal {
@override
void faireDuBruit() {
print('Le chat miaule.');
}
}
void main() {
Animal animal = Chien();
animal.faireDuBruit(); // Le chien aboie.
animal = Chat();
animal.faireDuBruit(); // Le chat miaule.
}
Polymorphisme d’interface:
- Dart prend également en charge le polymorphisme d’interface. Les interfaces définissent un contrat que les classes peuvent implémenter. Voici un exemple d’interface en Dart :
abstract class Animal {
void faireDuBruit();
}
class Chien implements Animal {
@override
void faireDuBruit() {
print('Le chien aboie.');
}
}
class Chat implements Animal {
@override
void faireDuBruit() {
print('Le chat miaule.');
}
}
void main() {
Animal animal = Chien();
animal.faireDuBruit(); // Le chien aboie.
animal = Chat();
animal.faireDuBruit(); // Le chat miaule.
}
Le polymorphisme en Dart offre une flexibilité qui facilite la création de code réutilisable et extensible. En choisissant le type d’héritage ou d’interface approprié, les développeurs peuvent concevoir des systèmes logiciels plus modulaires et évolutifs.
Activité
- Compréhension des Classes :
- Quelle est la classe de base dans cet exemple de polymorphisme en Dart?
- Quelles sont les classes dérivées? Quelles méthodes chaque classe dérivée override-t-elle?
- Comment la méthode faireDuBruit() de la classe de base est-elle implémentée?
- Appel de Méthodes :
- Comment appelez-vous la méthode faireDuBruit() pour un objet de type Chien?
- Quelle méthode est appelée lorsque vous appelez ecouterAnimal(animal1) dans la fonction main()?
- Si une nouvelle classe dérivée Oiseau était ajoutée, comment devriez-vous l’utiliser avec la fonction ecouterAnimal()?
- Création d’Objets :
- Créez une nouvelle classe dérivée appelée Oiseau qui étend la classe Animal. Ajoutez une méthode faireDuBruit() qui imprime « Le chant de l’oiseau ».
- Créez une instance de cette nouvelle classe et appelez la fonction ecouterAnimal() avec cette instance dans la fonction main().
- Concepts de Polymorphisme :
- Expliquez en vos propres mots ce qu’est le polymorphisme.
- En quoi le polymorphisme rend-il le code plus flexible et réutilisable?
- Utilisation de Types Abstraits :
- Ajoutez une méthode abstraite manger() à la classe de base Animal. Implémentez cette méthode dans chacune des classes dérivées.
// Classe de base
class Animal {
void faireDuBruit() {
print('Le son de l\'animal');
}
}
// Classes dérivées
class Chien extends Animal {
@override
void faireDuBruit() {
print('Le chien aboie');
}
}
class Chat extends Animal {
@override
void faireDuBruit() {
print('Le chat miaule');
}
}
// Fonction utilisant le polymorphisme
void ecouterAnimal(Animal animal) {
animal.faireDuBruit();
}
void main() {
// Utilisation du polymorphisme
Animal animal1 = Chien();
Animal animal2 = Chat();
ecouterAnimal(animal1); // Le chien aboie
ecouterAnimal(animal2); // Le chat miaule
}
Solution
- Nouvelle Classe Dérivée Oiseau :
class Oiseau extends Animal {
@override
void faireDuBruit() {
print('Le chant de l\'oiseau');
}
}
void main() {
// ...
Oiseau oiseau = new Oiseau();
ecouterAnimal(oiseau); // Le chant de l'oiseau
}
- Le polymorphisme est le concept selon lequel un objet peut être traité comme une instance de sa classe de base, même s’il est réellement une instance d’une classe dérivée. Cela permet d’écrire du code qui peut fonctionner de manière générique avec des objets de différentes classes, à condition qu’ils partagent une hiérarchie commune. En termes simples, le polymorphisme permet de traiter différents types d’objets de manière uniforme.
- Flexibilité : Permet de traiter des objets de manière générique, facilitant l’extension du code avec de nouvelles classes dérivées sans modifier le code existant.
- Réutilisabilité : Le code peut être réutilisé pour différents types d’objets, ce qui réduit la duplication de code et améliore la maintenabilité.
- Ajout d’une Méthode Abstraite manger() à la Classe de Base Animal :
abstract class Animal {
void faireDuBruit() {
print('Le son de l\'animal');
}
// Méthode abstraite
void manger();
}
class Chien extends Animal {
@override
void faireDuBruit() {
print('Le chien aboie');
}
@override
void manger() {
print('Le chien mange de la viande');
}
}
class Chat extends Animal {
@override
void faireDuBruit() {
print('Le chat miaule');
}
@override
void manger() {
print('Le chat mange du poisson');
}
}
class Oiseau extends Animal {
@override
void faireDuBruit() {
print('Le chant de l\'oiseau');
}
@override
void manger() {
print('L\'oiseau mange des graines');
}
}
Applications
-
App01
-
Enoncé
- Rédigez une classe Bâtiment comprenant les attributs suivants :
- La classe Bâtiment doit être équipée des constructeurs suivants :
- Assurez-vous que la classe Bâtiment inclut des accesseurs et mutateurs pour ses différents attributs. En outre, la classe Bâtiment devrait contenir une méthode ToString() qui génère une représentation textuelle du bâtiment.
- Élaborez une classe Maison qui hérite de la classe Bâtiment et qui possède les attributs suivants :
- NbPieces : le nombre de pièces de la maison.
- La classe Maison doit offrir les constructeurs suivants :
- De plus, assurez-vous que la classe Maison inclut des accesseurs et mutateurs (ou propriétés) pour ses divers attributs. Enfin, implémentez une méthode ToString() qui génère une représentation textuelle de la Maison.
- Enfin, élaborez un programme de test pour vérifier le fonctionnement correct des deux classes, Bâtiment et Maison.
-
Solution
adresse
-
Batiment()
Batiment(adresse)
-
Maison()
Maison(adresse, nbPieces)
class Batiment {
String adresse;
// Constructeurs
Batiment() : adresse = '';
Batiment.withAdresse(String adresse) : adresse = adresse;
// Accesseurs et mutateurs
String getAdresse() {
return adresse;
}
void setAdresse(String nouvelleAdresse) {
adresse = nouvelleAdresse;
}
// Méthode ToString
@override
String toString() {
return 'Bâtiment : Adresse - $adresse';
}
}
class Maison extends Batiment {
int nbPieces;
// Constructeurs
Maison() : nbPieces = 0;
Maison.withDetails(String adresse, int nbPieces)
: nbPieces = nbPieces,
super.withAdresse(adresse);
// Accesseurs et mutateurs
int getNbPieces() {
return nbPieces;
}
void setNbPieces(int nouveauNbPieces) {
nbPieces = nouveauNbPieces;
}
// Méthode ToString
@override
String toString() {
return 'Maison : Adresse - $adresse, Nombre de pièces - $nbPieces';
}
}
void main() {
// Test de la classe Bâtiment
Batiment batiment1 = Batiment();
print(batiment1); // Affiche : Bâtiment : Adresse -
Batiment batiment2 = Batiment.withAdresse('123 Rue Principale');
print(batiment2); // Affiche : Bâtiment : Adresse - 123 Rue Principale
// Test de la classe Maison
Maison maison1 = Maison();
print(maison1); // Affiche : Maison : Adresse - , Nombre de pièces - 0
Maison maison2 = Maison.withDetails('456 Rue Secondaire', 3);
print(maison2); // Affiche : Maison : Adresse - 456 Rue Secondaire, Nombre de pièces - 3
// Utilisation des accesseurs et mutateurs
maison1.setAdresse('789 Rue Tertiaire');
maison1.setNbPieces(5);
print(maison1); // Affiche : Maison : Adresse - 789 Rue Tertiaire, Nombre de pièces - 5
}