Mot-clé covariant
Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy. Leçon 61 sur 110.
Lorsque vous redéfinissez une méthode dans une sous-classe, Dart exige normalement que les types de paramètres correspondent exactement. Mais parfois, vous souhaitez qu'une méthode de sous-classe accepte un type plus spécifique que le parent. Le mot-clé covariant permet cela.
Considérez un scénario où une classe Animal possède une méthode qui accepte un autre Animal :
class Animal {
void chase(Animal other) {
print('Chasing an animal');
}
}
class Dog extends Animal {
@override
void chase(covariant Dog other) {
print('Dog chasing another dog');
}
}Sans covariant, Dart se plaindrait que Dog n'est pas du même type que Animal. En ajoutant covariant avant le paramètre, vous dites à Dart : « Je sais que c'est plus spécifique, et je m'assurerai que seul le bon type est transmis. »
Ceci est utile lorsque les sous-classes ne devraient logiquement fonctionner qu'avec leur propre type :
void main() {
Dog dog1 = Dog();
Dog dog2 = Dog();
dog1.chase(dog2); // Fonctionne : Un chien en poursuit un autre
}Soyez toutefois prudent : l'utilisation de covariant déplace la sécurité de type au moment de l'exécution. Si vous appelez la méthode via une référence parente avec le mauvais type, vous obtiendrez une erreur d'exécution au lieu d'une erreur de compilation. Utilisez-le lorsque vous êtes certain des types transmis.
Défi
FacileConstruisons un système de compatibilité entre animaux de compagnie qui utilise le mot-clé covariant pour garantir que les animaux ne peuvent jouer qu'avec ceux de leur propre espèce. Tu vas créer une hiérarchie d'animaux de compagnie dans laquelle chaque type possède une méthode playWith qui n'accepte qu'un animal du même type.
Tu vas organiser ton code en deux fichiers :
pets.dart: définis-y ta hiérarchie d'animaux de compagnie :- Une classe
Petavec une propriétéString nameet un constructeur. Inclus une méthodeplayWith(Pet other)qui affiche[name] plays with [other.name] - Une classe
Catqui étendPetet redéfinitplayWithen utilisant le mot-clécovariantpour n'accepter qu'unCat. Elle doit afficher[name] and [other.name] chase yarn together - Une classe
Dogqui étendPetet redéfinitplayWithen utilisant le mot-clécovariantpour n'accepter qu'unDog. Elle doit afficher[name] and [other.name] fetch the ball together - Une classe
Rabbitqui étendPetet redéfinitplayWithen utilisant le mot-clécovariantpour n'accepter qu'unRabbit. Elle doit afficher[name] and [other.name] hop around together
- Une classe
main.dart: importe ton fichier d'animaux de compagnie et montre comment chaque type d'animal joue exclusivement avec ceux de sa propre espèce :- Crée deux objets
Catnommés'Whiskers'et'Mittens', puis fais jouer Whiskers avec Mittens - Crée deux objets
Dognommés'Buddy'et'Max', puis fais jouer Buddy avec Max - Crée deux objets
Rabbitnommés'Flopsy'et'Cotton', puis fais jouer Flopsy avec Cotton
- Crée deux objets
Le mot-clé covariant permet à chaque sous-classe de restreindre le type du paramètre de Pet à son type spécifique, garantissant ainsi des interactions sûres du point de vue des types entre animaux de la même espèce.
Sortie attendue :
Whiskers and Mittens chase yarn together
Buddy and Max fetch the ball together
Flopsy and Cotton hop around togetherEssayez vous-même
import 'pets.dart';
void main() {
// TODO: Créer deux objets Cat nommés 'Whiskers' et 'Mittens'
// Ensuite, faire en sorte que Whiskers joue avec Mittens
// TODO: Créer deux objets Dog nommés 'Buddy' et 'Max'
// Ensuite, faire en sorte que Buddy joue avec Max
// TODO: Créer deux objets Rabbit nommés 'Flopsy' et 'Cotton'
// Ensuite, faire en sorte que Flopsy joue avec Cotton
}
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
1Fondamentaux de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs objetsLe mot-clé thisMéthodesVariables d’instanceBases des constructeursRécapitulatif - Calculatrice simple4Sécurité face aux valeurs nulles
Introduction à la sécurité face aux valeurs nullesNullable vs Non-NullableLes opérateurs ? et !Mot-clé Late et sécurité face aux valeurs nullesOpérateurs sensibles à nullSécurité face aux valeurs nulles dans les classesRécapitulatif – Système de profil utilisateur7Classes abstraites et interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémenter ou étendreInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et génériques
Vue d’ensemble des List, Set et MapCollections à typage sûrClasses génériquesMéthodes génériquesContraintes génériquesIterable et IteratorRécapitulatif – stockage générique2Constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs redirigésRécapitulatif - Constructeur de formes5Encapsulation
Membres publics vs privésLa convention du préfixe _Confidentialité au niveau de la bibliothèqueApprofondissement des getters et settersMasquage de l’informationRécapitulatif - Fiches des étudiants8Mixins
Introduction aux MixinsCréer des MixinsUtiliser plusieurs MixinsMot-clé on dans les MixinsMixin ou héritageMixin ou interfaceRécapitulatif - Système animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode et ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy3Propriétés des classes
Membres d’instance et statiquesChamps Final et ConstVariables différéesMéthodes et champs statiquesAccesseurs et mutateursRécapitulatif - Gestionnaire de compte bancaire6Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodeL’annotation @overrideLe mot-clé de classe finalConstructeurs et héritageRécapitulatif – Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification des types à l’exécutionLes opérateurs is et asMot-clé covariantRécapitulatif - Processeur de paiements12POO asynchrone
Futures et async/awaitNotions de base des StreamsContrôleurs de StreamsConstructeurs asynchronesAsynchrone dans les méthodes de classeRécapitulatif - récupérateur de données15Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron DépôtEntraînez-vous par vous-même : Compilateur Dart en ligne