Interfaccia Comparable
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 72 di 110.
Mentre == ti dice se due oggetti sono uguali, a volte devi sapere quale viene prima. L'interfaccia Comparable consente di ordinare i tuoi oggetti definendo un ordine naturale.
Per rendere una classe confrontabile, implementa Comparable<T> e sovrascrivi il metodo compareTo. Questo metodo restituisce un numero negativo se this viene prima di other, zero se sono uguali e un numero positivo se this viene dopo:
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
}Una volta che la tua classe implementa Comparable, puoi usare sort() senza fornire un comparatore personalizzato. I tipi numerici e stringa integrati implementano già Comparable, ed è per questo che grade.compareTo(other.grade) funziona direttamente.
Per l'ordine decrescente, basta invertire il confronto scambiando gli oggetti o negando il risultato:
@override
int compareTo(Student other) {
return other.grade.compareTo(grade); // Decrescente
}Sfida
FacileCostruiamo un sistema di gestione delle attività in cui le attività possono essere ordinate in base al loro livello di priorità! Creerai una classe Task che implementa l’interfaccia Comparable, consentendo di ordinare automaticamente un elenco di attività dalla priorità più alta a quella più bassa.
Organizzerai il codice in due file:
task.dart: Crea una classeTaskche rappresenta un’attività da svolgere con unname(String) e unapriority(int, dove i numeri più alti indicano una priorità maggiore). La tua attività deve implementareComparable<Task>in modo che, quando vengono ordinate, le attività compaiano in ordine decrescente di priorità (prima la priorità più alta). Inoltre, esegui l’override ditoString()per restituire il formato:[name] (Priority: [priority])main.dart: Importa il file delle attività e mostra come l’interfacciaComparableconsenta l’ordinamento automatico. Crea un elenco contenente queste quattro attività:'Write report'con priorità2'Fix critical bug'con priorità5'Update documentation'con priorità1'Review code'con priorità3
Before sorting:, poi stampa ogni attività. Ordina l’elenco usandosort(), stampa una riga vuota, poi stampaAfter sorting:seguito di nuovo da ogni attività.
Poiché la tua classe Task implementa Comparable, puoi chiamare direttamente sort() sull’elenco senza fornire un comparatore personalizzato. Le attività si ordineranno automaticamente in base alla tua implementazione di compareTo!
Output previsto:
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)Provalo tu
import 'task.dart';
void main() {
// TODO: Crea un elenco di oggetti Task con i seguenti elementi:
// - 'Write report' con priorità 2
// - 'Fix critical bug' con priorità 5
// - 'Update documentation' con priorità 1
// - 'Review code' con priorità 3
List<Task> tasks = [
// TODO: Aggiungi qui i quattro task
];
// TODO: Stampa "Before sorting:"
// TODO: Stampa ogni task nell'elenco
// TODO: Ordina l'elenco usando sort()
// TODO: Stampa una riga vuota
// TODO: Stampa "After sorting:"
// TODO: Stampa ogni task nell'elenco ordinato
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniLibrerie e importazioniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave thisMetodiVariabili di istanzaFondamenti dei costruttoriRiepilogo - Calcolatrice semplice4Sicurezza dei valori null
Introduzione alla sicurezza dei valori nullNullable e non nullableGli operatori ? e !La keyword late e la sicurezza dei valori nullOperatori null-awareSicurezza dei valori null nelle classiRiepilogo - Sistema di profili utente7Classi astratte e interfacce
Classi astratteMetodi astrattiInterfacce in DartInterfacce impliciteImplementare vs estendereInterfacce multipleRiepilogo - Calcolatore di forme10Collezioni e generici
Panoramica di List, Set e MapCollezioni sicure rispetto ai tipiClassi genericheMetodi genericiVincoli sui genericiIterable e IteratorRiepilogo - Archiviazione generica13Concetti avanzati di OOP
Composizione vs ereditarietàMetodi di estensioneClassi chiamabiliClassi sealed (Dart 3)Record (Dart 3)Pattern e matching (3.0)Enum con metodi16Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente2I costruttori in Dart
Costruttore predefinitoCostruttori con nomeListe di inizializzazioneCostruttori costantiCostruttori factoryCostruttori di reindirizzamentoRiepilogo - Crea forme5Incapsulamento
Membri pubblici e privatiConvenzione del prefisso _Visibilità a livello di libreriaApprofondimento su getter e setterNascondimento delle informazioniRiepilogo - Registri degli studenti8Mixin
Introduzione ai MixinCreare MixinUsare più MixinParola chiave on nei MixinMixin vs ereditarietàMixin vs interfacciaRiepilogo - Sistema animale11Metodi speciali
Sovrascrittura di toString()Sovrascrittura di hashCode e ==Interfaccia ComparableMetodo call()Sovrascrittura di noSuchMethodRiepilogo - Collezione personalizzata14Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneSingletonFactoryObserverStrategy3Proprietà delle classi
Membri di istanza e staticiCampi final e constVariabili lateMetodi e campi staticiGetter e setterRiepilogo - Gestore di conti bancari6Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiL’annotazione @overrideLa parola chiave final per le classiCostruttori ed ereditarietàRiepilogo - Gerarchia dei dipendenti9Polimorfismo
Fondamenti di polimorfismoPolimorfismo tramite interfacceControllo del tipo a runtimeGli operatori is e asParola chiave covariantRiepilogo - Elaboratore di pagamenti12OOP asincrona
Future e async/awaitNozioni di base sugli streamController degli streamCostruttori asincroniAsync nei metodi di classeRiepilogo - Recupero dei dati15Pattern di progettazione Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern RepositoryEsercitati da solo: Compilatore Dart online