Usare più Mixin
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 52 di 110.
Proprio come puoi implementare più interfacce, puoi anche applicare più mixin a una singola classe. Elencali semplicemente dopo la parola chiave with, separati da virgole.
mixin Swimming {
void swim() => print('Swimming');
}
mixin Flying {
void fly() => print('Flying');
}
mixin Walking {
void walk() => print('Walking');
}
class Duck with Swimming, Flying, Walking {
void quack() => print('Quack!');
}
void main() {
var duck = Duck();
duck.swim(); // Dal mixin Swimming
duck.fly(); // Dal mixin Flying
duck.walk(); // Dal mixin Walking
duck.quack(); // Dalla classe Duck
}L'ordine dei mixin è importante quando hanno metodi con lo stesso nome. Vince l'ultimo mixin nell'elenco:
mixin A {
void greet() => print('Hello from A');
}
mixin B {
void greet() => print('Hello from B');
}
class MyClass with A, B {}
void main() {
MyClass().greet(); // Output: Hello from B
}Poiché B viene dopo A, il suo metodo greet() ha la precedenza. Questo comportamento a livelli ti permette di comporre classi con esattamente le funzionalità di cui hai bisogno, combinando funzionalità provenienti da più fonti senza gerarchie di ereditarietà complesse.
Sfida
FacileCostruiamo un sistema di dispositivi per la casa intelligente che combina più funzionalità tramite i mixin. Creerai diversi mixin che rappresentano varie funzionalità intelligenti, poi realizzerai un dispositivo che li utilizza tutti insieme.
Organizzerai il codice in due file:
smart_features.dart: definisci tre mixin che forniscono diverse funzionalità per la casa intelligente:- Un mixin
VoiceControlcon un metodovoiceCommand(String command)che stampaVoice: [command] - Un mixin
WiFiEnabledcon un metodoconnectWiFi(String network)che stampaConnected to [network] - Un mixin
PowerSavercon un metodoenterSleepMode()che stampaEntering sleep mode...e un metodowakeUp()che stampaWaking up!
SmartSpeakerche utilizza tutti e tre i mixin. Aggiungi una proprietàString namecon un costruttore e includi un metodoplayMusic(String song)che stampa[name] playing: [song]- Un mixin
main.dart: importa il file delle funzionalità intelligenti e mostra come l'altoparlante combina tutte le funzionalità:- Crea uno
SmartSpeakerchiamato'Echo' - Chiama
connectWiFi('HomeNetwork') - Chiama
voiceCommand('Play jazz') - Chiama
playMusic('Smooth Jazz Mix') - Chiama
enterSleepMode() - Chiama
wakeUp()
- Crea uno
Il tuo SmartSpeaker acquisisce metodi da tutti e tre i mixin con un'unica clausola with, dimostrando come più mixin ti permettano di comporre esattamente le funzionalità di cui hai bisogno senza ricorrere a un'ereditarietà complessa.
Output previsto:
Connected to HomeNetwork
Voice: Play jazz
Echo playing: Smooth Jazz Mix
Entering sleep mode...
Waking up!Provalo tu
import 'smart_features.dart';
void main() {
// TODO: Crea uno SmartSpeaker chiamato 'Echo'
// TODO: Chiama connectWiFi('HomeNetwork')
// TODO: Chiama voiceCommand('Play jazz')
// TODO: Chiama playMusic('Smooth Jazz Mix')
// TODO: Chiama enterSleepMode()
// TODO: Chiama wakeUp()
}
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