Menu
Coddy logo textTech

Usando Múltiplos Mixins

Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy — lição 52 de 110.

Assim como você pode implementar múltiplas interfaces, você também pode aplicar múltiplos mixins a uma única classe. Basta listá-los após a palavra-chave with, separados por vírgulas.

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();   // Do mixin Swimming
  duck.fly();    // Do mixin Flying
  duck.walk();   // Do mixin Walking
  duck.quack();  // Da classe Duck
}

A ordem dos mixins importa quando eles possuem métodos com o mesmo nome. O último mixin na lista vence:

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

Como B vem depois de A, seu método greet() tem precedência. Este comportamento de camadas permite compor classes com exatamente as capacidades que você precisa, combinando funcionalidades de múltiplas fontes sem hierarquias de herança complexas.

challenge icon

Desafio

Fácil

Vamos construir um sistema de dispositivos domésticos inteligentes que combina múltiplas capacidades através de mixins. Você criará diferentes mixins representando vários recursos inteligentes e, em seguida, construirá um dispositivo que utiliza todos eles juntos.

Você organizará seu código em dois arquivos:

  • smart_features.dart: Defina três mixins que fornecem diferentes capacidades de casa inteligente:
    • Um mixin VoiceControl com um método voiceCommand(String command) que imprime Voice: [command]
    • Um mixin WiFiEnabled com um método connectWiFi(String network) que imprime Connected to [network]
    • Um mixin PowerSaver com um método enterSleepMode() que imprime Entering sleep mode... e um método wakeUp() que imprime Waking up!
    Em seguida, crie uma classe SmartSpeaker que utilize todos os três mixins. Adicione uma propriedade String name com um construtor e inclua um método playMusic(String song) que imprime [name] playing: [song]
  • main.dart: Importe seu arquivo de recursos inteligentes e demonstre como o alto-falante combina todas as capacidades:
    • Crie um SmartSpeaker chamado 'Echo'
    • Chame connectWiFi('HomeNetwork')
    • Chame voiceCommand('Play jazz')
    • Chame playMusic('Smooth Jazz Mix')
    • Chame enterSleepMode()
    • Chame wakeUp()

Seu SmartSpeaker ganha métodos de todos os três mixins com uma única cláusula with, demonstrando como múltiplos mixins permitem compor exatamente as capacidades que você precisa sem herança complexa.

Saída esperada:

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

Folha de consulta

Uma classe pode aplicar múltiplos mixins listando-os após a palavra-chave with, separados por vírgulas:

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();   // Do mixin Swimming
  duck.fly();    // Do mixin Flying
  duck.quack();  // Da classe Duck
}

Quando múltiplos mixins possuem métodos com o mesmo nome, o último mixin na lista tem precedência:

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

Experimente você mesmo

import 'smart_features.dart';

void main() {
  // TODO: Criar um SmartSpeaker chamado 'Echo'
  
  // TODO: Chamar connectWiFi('HomeNetwork')
  
  // TODO: Chamar voiceCommand('Play jazz')
  
  // TODO: Chamar playMusic('Smooth Jazz Mix')
  
  // TODO: Chamar enterSleepMode()
  
  // TODO: Chamar wakeUp()
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos