Interface Comparable
Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy. Leçon 72 sur 110.
Alors que == vous indique si deux objets sont égaux, vous devez parfois savoir lequel vient en premier. L’interface Comparable permet de trier vos objets en définissant un ordre naturel.
Pour rendre une classe comparable, implémentez Comparable<T> et redéfinissez la méthode compareTo. Cette méthode renvoie un nombre négatif si this vient avant other, zéro s’ils sont égaux et un nombre positif si this vient après :
class Student implements Comparable<Student> {
String name;
int grade;
Student(this.name, this.grade);
@override
int compareTo(Student other) {
return grade.compareTo(other.grade);
}
}
void main() {
var students = [
Student('Alice', 85),
Student('Bob', 92),
Student('Carol', 78),
];
students.sort();
for (var s in students) {
print('${s.name}: ${s.grade}');
}
// Carol: 78, Alice: 85, Bob: 92
}Une fois que votre classe implémente Comparable, vous pouvez utiliser sort() sans fournir de comparateur personnalisé. Les types numériques et chaînes intégrés implémentent déjà Comparable, c’est pourquoi grade.compareTo(other.grade) fonctionne directement.
Pour l’ordre décroissant, inversez simplement la comparaison en échangeant les objets ou en niant le résultat :
@override
int compareTo(Student other) {
return other.grade.compareTo(grade); // Décroissant
}Défi
FacileConstruisons un système de gestion des tâches où les tâches peuvent être triées selon leur niveau de priorité ! Vous allez créer une classe Task qui implémente l’interface Comparable, permettant de trier automatiquement une liste de tâches de la priorité la plus élevée à la plus faible.
Vous organiserez votre code dans deux fichiers :
task.dart: Créez une classeTaskqui représente un élément de liste de tâches avec unname(String) et unepriority(int, où les nombres les plus élevés signifient une priorité plus élevée). Votre tâche doit implémenterComparable<Task>afin que, lors du tri, les tâches apparaissent dans l’ordre décroissant de priorité (la priorité la plus élevée en premier). Remplacez égalementtoString()pour renvoyer le format :[name] (Priority: [priority])main.dart: Importez votre fichier de tâches et montrez comment l’interfaceComparablepermet le tri automatique. Créez une liste contenant ces quatre tâches :'Write report'avec une priorité de2'Fix critical bug'avec une priorité de5'Update documentation'avec une priorité de1'Review code'avec une priorité de3
Before sorting:, puis affichez chaque tâche. Triez la liste à l’aide desort(), affichez une ligne vide, puis affichezAfter sorting:suivi de chaque tâche à nouveau.
Comme votre classe Task implémente Comparable, vous pouvez appeler directement sort() sur la liste sans fournir de comparateur personnalisé. Les tâches seront automatiquement organisées en fonction de votre implémentation de compareTo !
Résultat attendu :
Before sorting:
Write report (Priority: 2)
Fix critical bug (Priority: 5)
Update documentation (Priority: 1)
Review code (Priority: 3)
After sorting:
Fix critical bug (Priority: 5)
Review code (Priority: 3)
Write report (Priority: 2)
Update documentation (Priority: 1)Essayez vous-même
import 'task.dart';
void main() {
// TODO: Créer une liste d'objets Task avec les éléments suivants :
// - 'Write report' avec priorité 2
// - 'Fix critical bug' with priority 5
// - 'Update documentation' with priority 1
// - 'Review code' avec priorité 3
List<Task> tasks = [
// TODO: Ajoutez les quatre tâches ici
];
// TODO: Print "Before sorting:"
// TODO: Affichez chaque tâche de la liste
// TODO: Triez la liste en utilisant sort()
// TODO: Affichez une ligne vide
// TODO: Print "After sorting:"
// TODO: Affichez chaque tâche de la liste triée
}
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