Bases de l'héritage
Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy — leçon 36 sur 110.
L'héritage permet à une classe d'acquérir les propriétés et les méthodes d'une autre classe. Au lieu de réécrire le même code, vous créez une nouvelle classe qui s'appuie sur une classe existante. La classe d'origine est appelée le parent (ou superclasse), et la nouvelle classe est l'enfant (ou sous-classe).
En Dart, vous utilisez le mot-clé extends pour hériter d'une classe parente :
class Animal {
String name;
Animal(this.name);
void eat() {
print('$name is eating');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
void bark() {
print('$name says woof!');
}
}
void main() {
var dog = Dog('Buddy');
dog.eat(); // Hérité de Animal
dog.bark(); // Défini dans Dog
}La classe Dog a automatiquement accès à la propriété name et à la méthode eat() de Animal, ainsi qu'à sa propre méthode bark(). Cela crée une relation « est un » — un Dog est un Animal.
La classe enfant peut ajouter de nouvelles propriétés et méthodes, mais elle hérite de tout ce qui est public du parent. Notez que les membres privés (ceux avec _) ne sont pas directement accessibles dans les sous-classes de bibliothèques différentes, bien qu'ils existent toujours dans l'objet hérité.
Défi
FacileConstruisons un système de véhicules qui démontre comment l'héritage permet aux classes enfants de réutiliser et d'étendre les fonctionnalités de la classe parente. Vous allez créer une classe parente pour les véhicules généraux et une classe enfant pour un type spécifique de véhicule.
Vous organiserez votre code en deux fichiers :
vehicle.dart: Définissez vos classes ici :- Une classe
Vehicle(le parent) avec une propriétéString brand, un constructeur qui prend la marque, et une méthodestart()qui affiche[brand] engine starting... - Une classe
Motorcyclequi étendVehicle. Elle doit avoir une propriété supplémentaireint cc(cylindrée du moteur), un constructeur qui prend à la fois la marque et les cc (en passant la marque au parent viasuper), et sa propre méthodewheelie()qui affiche[brand] is doing a wheelie!
- Une classe
main.dart: Importez votre fichier de véhicule et démontrez l'héritage en action :- Créez un
Vehicleavec la marque'Toyota' - Appelez sa méthode
start() - Créez une
Motorcycleavec la marque'Harley'et cc1200 - Appelez la méthode
start()de la moto (héritée de Vehicle) - Appelez la méthode
wheelie()de la moto (définie dans Motorcycle) - Affichez
Motorcycle engine: [cc]ccpour montrer la propriété propre à l'enfant
- Créez un
Remarquez comment la classe Motorcycle accède automatiquement à la propriété brand et à la méthode start() de Vehicle, tout en ayant sa propre propriété unique cc et sa méthode wheelie(). C'est là toute la puissance de l'héritage : construire sur du code existant.
Résultat attendu :
Toyota engine starting...
Harley engine starting...
Harley is doing a wheelie!
Motorcycle engine: 1200ccAide-mémoire
Utilisez le mot-clé extends pour créer une classe enfant qui hérite d'une classe parente :
class Animal {
String name;
Animal(this.name);
void eat() {
print('$name is eating');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
void bark() {
print('$name says woof!');
}
}La classe enfant hérite de toutes les propriétés et méthodes publiques de la classe parente. Utilisez super dans le constructeur de l'enfant pour passer des paramètres au constructeur du parent.
Les classes enfants peuvent ajouter leurs propres propriétés et méthodes tout en accédant à celles héritées :
var dog = Dog('Buddy');
dog.eat(); // Hérité de Animal
dog.bark(); // Défini dans DogCela crée une relation « est un » - un Dog est un Animal.
Essayez vous-même
import 'vehicle.dart';
void main() {
// TODO: Créer un Vehicle avec la marque 'Toyota'
// TODO: Appeler la méthode start() du vehicle
// TODO: Créer une Motorcycle avec la marque 'Harley' et cc 1200
// TODO: Appeler la méthode start() de la motorcycle (héritée de Vehicle)
// TODO: Appeler la méthode wheelie() de la motorcycle
// TODO: Afficher 'Motorcycle engine: [cc]cc' en utilisant la propriété cc de la motorcycle
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Les bases de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesVariables d'instanceBases des constructeursRécapitulatif - Calculatrice simple4Null Safety
Introduction à la Null SafetyNullable vs Non-NullableLes opérateurs ? et !Le mot-clé late et la Null SafetyLes opérateurs Null-AwareLa Null Safety dans les classesRécapitulatif - Système de profil utilisateur7Classes abstraites et Interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémentation vs ExtensionInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et Génériques
Aperçu des List, Set et MapCollections Type-SafeClasses génériquesMéthodes génériquesContraintes de généricitéIterable & IteratorRécapitulatif - Stockage générique2Les constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs de redirectionRécapitulatif - Shape Builder5Encapsulation
Membres publics vs privésLa convention du préfixe _Visibilité au niveau de la bibliothèqueApprofondissement des Getters & SettersMasquage d'informationsRécapitulatif - Dossiers d'étudiants8Mixins
Introduction aux MixinsCréation de MixinsUtilisation de plusieurs MixinsLe mot-clé on dans les MixinsMixin vs HéritageMixin vs InterfaceRécapitulatif - Système Animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode & ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie3Propriétés de classe
Membres d'instance vs statiquesChamps Final & ConstVariables LateMéthodes et champs statiquesGetters et SettersRécapitulatif - Gestionnaire de compte bancaire6Héritage
Bases de l'héritageLe mot-clé superRedéfinition de méthodeL'annotation @overrideLe mot-clé final pour les classesConstructeurs et héritageRécapitulatif - Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification de type à l'exécutionLes opérateurs is & asMot-clé covariantRécapitulatif - Processeur de paiement12POO Asynchrone
Futures & async/awaitBases des StreamsStream ControllersConstructeurs asynchronesL'asynchrone dans les méthodes de classeRécapitulatif - Data Fetcher15Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository