Menu
Coddy logo textTech

Uso de múltiples Mixins

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy — lección 52 de 110.

Al igual que puedes implementar múltiples interfaces, también puedes aplicar múltiples mixins a una sola clase. Simplemente lístalos después de la palabra clave with, separados por comas.

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();   // Del mixin Swimming
  duck.fly();    // Del mixin Flying
  duck.walk();   // Del mixin Walking
  duck.quack();  // De la clase Duck
}

El orden de los mixins importa cuando tienen métodos con el mismo nombre. El último mixin de la lista prevalece:

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();  // Salida: Hello from B
}

Dado que B viene después de A, su método greet() tiene precedencia. Este comportamiento de capas te permite componer clases con exactamente las capacidades que necesitas, combinando funcionalidad de múltiples fuentes sin jerarquías de herencia complejas.

challenge icon

Desafío

Fácil

Vamos a construir un sistema de dispositivos para el hogar inteligente que combina múltiples capacidades a través de mixins. Crearás diferentes mixins que representan varias funciones inteligentes y luego construirás un dispositivo que las utilice todas juntas.

Organizarás tu código en dos archivos:

  • smart_features.dart: Define tres mixins que proporcionan diferentes capacidades de hogar inteligente:
    • Un mixin VoiceControl con un método voiceCommand(String command) que imprime Voice: [command]
    • Un mixin WiFiEnabled con un método connectWiFi(String network) que imprime Connected to [network]
    • Un mixin PowerSaver con un método enterSleepMode() que imprime Entering sleep mode... y un método wakeUp() que imprime Waking up!
    Luego, crea una clase SmartSpeaker que utilice los tres mixins. Agrega una propiedad String name con un constructor, e incluye un método playMusic(String song) que imprime [name] playing: [song]
  • main.dart: Importa tu archivo de funciones inteligentes y demuestra cómo el altavoz combina todas las capacidades:
    • Crea un SmartSpeaker llamado 'Echo'
    • Llama a connectWiFi('HomeNetwork')
    • Llama a voiceCommand('Play jazz')
    • Llama a playMusic('Smooth Jazz Mix')
    • Llama a enterSleepMode()
    • Llama a wakeUp()

Tu SmartSpeaker obtiene métodos de los tres mixins con una sola cláusula with, demostrando cómo múltiples mixins te permiten componer exactamente las capacidades que necesitas sin una herencia compleja.

Salida esperada:

Connected to HomeNetwork
Voice: Play jazz
Echo playing: Smooth Jazz Mix
Entering sleep mode...
Waking up!

Hoja de referencia

Una clase puede aplicar múltiples mixins enumerándolos después de la palabra clave with, separados por comas:

mixin Swimming {
  void swim() => print('Swimming');
}

mixin Flying {
  void fly() => print('Flying');
}

class Duck with Swimming, Flying {
  void quack() => print('Quack!');
}

void main() {
  var duck = Duck();
  duck.swim();   // Del mixin Swimming
  duck.fly();    // Del mixin Flying
  duck.quack();  // De la clase Duck
}

Cuando múltiples mixins tienen métodos con el mismo nombre, el último mixin en la lista tiene precedencia:

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();  // Salida: Hello from B
}

Pruébalo tú mismo

import 'smart_features.dart';

void main() {
  // TODO: Crear un SmartSpeaker llamado 'Echo'
  
  // TODO: Llamar a connectWiFi('HomeNetwork')
  
  // TODO: Llamar a voiceCommand('Play jazz')
  
  // TODO: Llamar a playMusic('Smooth Jazz Mix')
  
  // TODO: Llamar a enterSleepMode()
  
  // TODO: Llamar a wakeUp()
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos