Jenner Acosta Diaz
Dart Website

Mixins

Lectura recomendada:

https://medium.com/flutter-community/dart-what-are-mixins-3a72344011f3

En Dart, un mixin es una forma de reutilizar código en múltiples clases sin utilizar herencia tradicional. Un mixin permite agregar funcionalidad adicional a una clase sin necesidad de ser su superclase.

Para crear un mixin en Dart, se utiliza la palabra clave mixin seguida del nombre del mixin y se define una serie de métodos y/o propiedades que se pueden utilizar en otras clases.

Aquí tienes un ejemplo que muestra cómo se crea y se utiliza un mixin en Dart:

mixin Saludador {
  void saludar() {
    print('¡Hola!');
  }

  void despedir() {
    print('¡Adiós!');
  }
}

class Persona with Saludador {
  String nombre;

  Persona(this.nombre);
}

void main() {
  Persona persona = Persona('Juan');
  persona.saludar(); // Imprime "¡Hola!"
  persona.despedir(); // Imprime "¡Adiós!"
}

En el ejemplo anterior, se define un mixin llamado Saludador que proporciona dos métodos: saludar() y despedir(). El mixin se declara con la palabra clave mixin seguida del nombre del mixin.

Luego, se crea una clase Persona que utiliza el mixin Saludador utilizando la palabra clave with. Esto permite que la clase Persona tenga acceso a los métodos definidos en el mixin.

En la función main(), se crea un objeto persona de la clase Persona y se puede llamar a los métodos saludar() y despedir() que provienen del mixin Saludador.

Los mixins son útiles cuando se desea agregar funcionalidad adicional a varias clases sin tener que repetir código o establecer una relación de herencia compleja. Permiten una composición flexible y reutilización de código en Dart. Es importante destacar que una clase puede usar múltiples mixins a través de la palabra clave with.

Ejercicio de la Sesión

//Clase abstracta Animal
abstract class Animal {}
 
//Clases que heredan de Animal
class Mamifero extends Animal {}
 
class Ave extends Animal {}
 
class Pez extends Animal {}
 
//mixins
mixin Volador {
  void volar() => print("Estoy volando");
}
 
mixin Caminante {
  void caminar() => print("Estoy caminando");
}
 
mixin Nadador {
  void nadar() => print("Estoy nadando");
}
 
//Mamiferos
class Delfin extends Mamifero with Nadador {}
 
class Murcielago extends Mamifero with Volador, Caminante {}
 
class Gato extends Mamifero with Caminante {}
 
//Aves
class Paloma extends Ave with Caminante, Volador {}
 
class Pato extends Ave with Caminante, Nadador, Volador {}
 
//Peces
class Tiburon extends Pez with Nadador {}
 
class PezVolador extends Pez with Nadador, Volador {}
 
//Función main principal
void main() {
  print("Flipper");
  final flipper = Delfin();
  flipper.nadar();
 
  print("Batman");
  final batman = Murcielago();
  batman.caminar();
  batman.volar();
 
  print("namor");
  final namor = Pato();
  namor.caminar();
  namor.volar();
  namor.nadar();
}