Creare Mixin
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 51 di 110.
Ora che hai capito cosa sono i mixin, vediamo come crearli correttamente. Un mixin viene dichiarato usando la parola chiave mixin invece di class.
mixin Logging {
void log(String message) {
print('[LOG] $message');
}
void logError(String error) {
print('[ERROR] $error');
}
}I mixin possono contenere metodi, proprietà e persino getter e setter, proprio come le classi. Tuttavia, c'è una regola importante: i mixin non possono avere costruttori. Poiché i mixin sono pensati per essere «mescolati» alle classi anziché istanziati direttamente, non hanno bisogno di logica di inizializzazione.
mixin Timestamped {
DateTime createdAt = DateTime.now();
String get formattedTime => createdAt.toString();
void printTimestamp() {
print('Created at: $formattedTime');
}
}
class Document with Timestamped {
String title;
Document(this.title);
}
void main() {
var doc = Document('Report');
doc.printTimestamp(); // Usa il metodo del mixin
print(doc.createdAt); // Usa la proprietà del mixin
}Quando applichi un mixin con with, tutti i suoi membri diventano parte della tua classe. La classe può usarli direttamente, così come qualsiasi codice che abbia un'istanza di quella classe. Questo rende i mixin un modo semplice per aggiungere funzionalità riutilizzabili senza la complessità delle gerarchie di ereditarietà.
Sfida
FacileCostruiamo un sistema di messaggistica che mostri come creare mixin con metodi, proprietà e getter. Progetterai un mixin che aggiunge funzionalità di formattazione a diversi tipi di messaggi.
Organizzerai il codice in due file:
messaging.dart: definisci qui il tuo mixin e le classi dei messaggi:- Un mixin
Formattableche contiene:- Una proprietà
String prefixinizializzata a'>>>' - Un getter
separatorche restituisce' | ' - Un metodo
format(String text)che restituisce la stringa[prefix][separator][text] - Un metodo
formatBold(String text)che restituisce**[text]**
- Una proprietà
- Una classe
TextMessageche usa il mixinFormattable. Aggiungi una proprietàString sendercon un costruttore. Includi un metodosend(String content)che stampa il risultato della chiamata aformat()con[sender]: [content] - Una classe
AlertMessageche usa anch'essa il mixinFormattable. Aggiungi una proprietàString levelcon un costruttore. Includi un metodoalert(String content)che stampa il risultato della chiamata aformat()con[[level]] [formatBold(content)]
- Un mixin
main.dart: importa il tuo file di messaggistica e mostra come entrambi i tipi di messaggio acquisiscono le funzionalità di formattazione dal mixin:- Crea un
TextMessagecon mittente'Alice' - Crea un
AlertMessagecon livello'WARNING' - Chiama
send('Hello there!')sul messaggio di testo - Chiama
alert('System overload')sul messaggio di avviso
- Crea un
Il tuo mixin dimostra che i mixin possono contenere proprietà con valori predefiniti, getter che calcolano valori e più metodi che possono anche richiamarsi a vicenda. Entrambe le classi di messaggi ottengono tutte queste funzionalità semplicemente usando la parola chiave with.
Output previsto:
>>> | Alice: Hello there!
>>> | [WARNING] **System overload**Provalo tu
import 'messaging.dart';
void main() {
// TODO: Crea un TextMessage con sender 'Alice'
// TODO: Crea un AlertMessage con level 'WARNING'
// TODO: Chiama send('Hello there!') sul messaggio di testo
// TODO: Chiama alert('System overload') sul messaggio di avviso
}
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