Enum con metodi
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 88 di 110.
In Dart, gli enum non sono semplici elenchi di costanti: possono avere campi, costruttori e metodi, il che li rende potenti mini-classi. Questa funzionalità si chiama enum avanzati e consente di associare comportamento e dati direttamente a ogni valore dell'enum.
enum Status {
pending('Waiting'),
approved('Accepted'),
rejected('Denied');
final String displayName;
const Status(this.displayName);
bool get isFinalized => this == approved || this == rejected;
}
void main() {
var status = Status.pending;
print(status.displayName); // Waiting
print(status.isFinalized); // false
print(Status.approved.isFinalized); // true
}Ogni valore dell'enum chiama il costruttore con i propri argomenti specifici. Il costruttore deve essere const e tutti i campi devono essere final. Puoi aggiungere getter e metodi che operano sui dati dell'enum o li confrontano con altri valori.
Gli enum avanzati possono anche implementare interfacce, offrendo loro ancora più flessibilità:
enum Priority implements Comparable<Priority> {
low(1),
medium(2),
high(3);
final int level;
const Priority(this.level);
@override
int compareTo(Priority other) => level.compareTo(other.level);
}
void main() {
var tasks = [Priority.high, Priority.low, Priority.medium];
tasks.sort();
print(tasks); // [Priority.low, Priority.medium, Priority.high]
}Gli enum avanzati sono ideali quando hai un insieme fisso di valori a cui associare dati o comportamenti, come codici di stato con messaggi, priorità con livelli o direzioni con coordinate.
Sfida
FacileCostruiamo un sistema di gestione delle attività usando gli enum avanzati! Creerai un enum che rappresenta diverse categorie di attività, ciascuna con le proprie proprietà e comportamenti per aiutarti a organizzare e stabilire le priorità del lavoro.
Organizzerai il codice in due file:
task_category.dart: crea un enum avanzato chiamatoTaskCategoryche rappresenta diversi tipi di attività in un progetto. Ogni categoria dovrebbe avere:- Un campo
String labelper un nome leggibile - Un campo
int priority(1 indica la priorità più alta, 3 quella più bassa) - Un costruttore
constche inizializza entrambi i campi - Quattro valori enum:
bug(etichetta: "Bug Fix", priorità: 1),feature(etichetta: "New Feature", priorità: 2),documentation(etichetta: "Documentation", priorità: 3) etesting(etichetta: "Testing", priorità: 2) - Un getter
isUrgentche restituiscetruese la priorità è 1 - Un metodo
describe()che restituisce una stringa nel formato:[label] (Priority: [priority])
Comparable<TaskCategory>, così le attività possono essere ordinate per priorità (il numero di priorità più basso viene prima).- Un campo
main.dart: importa il tuo enum delle categorie di attività e mostrane le funzionalità:- Crea un elenco contenente tutte e quattro le categorie di attività in questo ordine:
feature,bug,documentation,testing - Stampa la descrizione di ogni categoria usando il metodo
describe(), una per riga - Stampa una riga vuota
- Ordina l'elenco per priorità e stampa
After sorting by priority: - Stampa l'etichetta di ogni categoria ordinata, una per riga
- Stampa una riga vuota
- Stampa
Urgent tasks: - Scorri l'ordine originale (
feature,bug,documentation,testing) e stampa solo le etichette delle categorie per cuiisUrgentè true
- Crea un elenco contenente tutte e quattro le categorie di attività in questo ordine:
Questa sfida combina le funzionalità degli enum avanzati: campi, costruttori, getter, metodi e implementazione di interfacce, che lavorano insieme per creare un utile sistema di categorizzazione delle attività!
Output previsto:
New Feature (Priority: 2)
Bug Fix (Priority: 1)
Documentation (Priority: 3)
Testing (Priority: 2)
After sorting by priority:
Bug Fix
New Feature
Testing
Documentation
Urgent tasks:
Bug FixProvalo tu
import 'task_category.dart';
void main() {
// TODO: Crea una lista contenente tutte e quattro le categorie di attività in questo ordine:
// feature, bug, documentation, testing
// TODO: Stampa la descrizione di ogni categoria usando describe(), una per riga
// TODO: Stampa una riga vuota
// TODO: Ordina la lista per priorità
// TODO: Stampa "After sorting by priority:"
// TODO: Stampa l'etichetta di ogni categoria ordinata, una per riga
// TODO: Stampa una riga vuota
// TODO: Stampa "Urgent tasks:"
// TODO: Scorri l'ordine originale (feature, bug, documentation, testing)
// e stampa solo le etichette delle categorie per cui isUrgent è true
}
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