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 es importante 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

Construyamos un sistema de dispositivos domésticos inteligentes que combine varias capacidades mediante mixins. Crearás diferentes mixins que representen distintas funciones inteligentes y, después, construirás un dispositivo que los utilice todos juntos.

Organizarás tu código en dos archivos:

  • smart_features.dart: Define tres mixins que proporcionen distintas capacidades para el 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!
    Después, crea una clase SmartSpeaker que utilice los tres mixins. Añade una propiedad String name con un constructor e incluye un método playMusic(String song) que imprima [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 mediante una sola cláusula with, lo que demuestra cómo varios 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!

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

Practica por tu cuenta: Compilador de Dart online