Menu
Coddy logo textTech

Creación de Mixins

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

Ahora que entiendes qué son los mixins, veamos cómo crearlos correctamente. Un mixin se declara utilizando la palabra clave mixin en lugar de class.

mixin Logging {
  void log(String message) {
    print('[LOG] $message');
  }
  
  void logError(String error) {
    print('[ERROR] $error');
  }
}

Los mixins pueden contener métodos, propiedades e incluso getters y setters, al igual que las clases. Sin embargo, hay una regla importante: los mixins no pueden tener constructores. Dado que los mixins están destinados a ser "mezclados" en lugar de ser instanciados directamente, no necesitan lógica de inicialización.

mixin Timestamped {
  DateTime createdAt = DateTime.now();
  
  String get formattedTime => createdAt.toString();
  
  void printTimestamp() {
    print('Created at: $formattedTime');
  }
}

class Document with Timestamped {
  String title;
  Document(this.title);
}

void main() {
  var doc = Document('Report');
  doc.printTimestamp();  // Utiliza el método del mixin
  print(doc.createdAt);  // Utiliza la propiedad del mixin
}

Cuando aplicas un mixin con with, todos sus miembros pasan a formar parte de tu clase. La clase puede usarlos directamente, y también puede hacerlo cualquier código que tenga una instancia de esa clase. Esto hace que los mixins sean una forma limpia de añadir funcionalidad reutilizable sin la complejidad de las jerarquías de herencia.

challenge icon

Desafío

Fácil

Vamos a construir un sistema de mensajería que muestre cómo crear mixins con métodos, propiedades y getters. Diseñarás un mixin que añade capacidades de formateo a diferentes tipos de mensajes.

Organizarás tu código en dos archivos:

  • messaging.dart: Define tu mixin y las clases de mensaje aquí:
    • Un mixin Formattable que contiene:
      • Una propiedad String prefix inicializada en '>>>'
      • Un getter separator que devuelve ' | '
      • Un método format(String text) que devuelve el string [prefix][separator][text]
      • Un método formatBold(String text) que devuelve **[text]**
    • Una clase TextMessage que utiliza el mixin Formattable. Añade una propiedad String sender con un constructor. Incluye un método send(String content) que imprima el resultado de llamar a format() con [sender]: [content]
    • Una clase AlertMessage que también utiliza el mixin Formattable. Añade una propiedad String level con un constructor. Incluye un método alert(String content) que imprima el resultado de llamar a format() con [[level]] [formatBold(content)]
  • main.dart: Importa tu archivo de mensajería y demuestra cómo ambos tipos de mensaje obtienen capacidades de formateo del mixin:
    • Crea un TextMessage con sender 'Alice'
    • Crea un AlertMessage con level 'WARNING'
    • Llama a send('Hello there!') en el mensaje de texto
    • Llama a alert('System overload') en el mensaje de alerta

Tu mixin demuestra que los mixins pueden contener propiedades con valores por defecto, getters que calculan valores y múltiples métodos que incluso pueden llamarse entre sí. Ambas clases de mensaje obtienen toda esta funcionalidad simplemente usando la palabra clave with.

Salida esperada:

>>> | Alice: Hello there!
>>> | [WARNING] **System overload**

Hoja de referencia

Los mixins se declaran utilizando la palabra clave mixin en lugar de class:

mixin Logging {
  void log(String message) {
    print('[LOG] $message');
  }
  
  void logError(String error) {
    print('[ERROR] $error');
  }
}

Los mixins pueden contener métodos, propiedades, getters y setters, pero no pueden tener constructores:

mixin Timestamped {
  DateTime createdAt = DateTime.now();
  
  String get formattedTime => createdAt.toString();
  
  void printTimestamp() {
    print('Created at: $formattedTime');
  }
}

Aplica mixins a las clases utilizando la palabra clave with. Todos los miembros del mixin pasan a formar parte de la clase:

class Document with Timestamped {
  String title;
  Document(this.title);
}

void main() {
  var doc = Document('Report');
  doc.printTimestamp();  // Usa el método del mixin
  print(doc.createdAt);  // Usa la propiedad del mixin
}

Pruébalo tú mismo

import 'messaging.dart';

void main() {
  // TODO: Crea un TextMessage con el remitente 'Alice'
  
  // TODO: Crea un AlertMessage con el nivel 'WARNING'
  
  // TODO: Llama a send('Hello there!') en el mensaje de texto
  
  // TODO: Llama a alert('System overload') en el mensaje de alerta
}
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