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 usando 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();  // Usa el método del mixin
  print(doc.createdAt);  // Usa 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, al igual que cualquier código que tenga una instancia de esa clase. Esto convierte a los mixins en una forma sencilla de añadir funcionalidad reutilizable sin la complejidad de las jerarquías de herencia.

challenge icon

Desafío

Fácil

Construyamos 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 formato a distintos tipos de mensajes.

Organizarás tu código en dos archivos:

  • messaging.dart: Define aquí tu mixin y tus clases de mensajes:
    • Un mixin Formattable que contiene:
      • Una propiedad String prefix inicializada con '>>>'
      • Un getter separator que devuelve ' | '
      • Un método format(String text) que devuelve la cadena [prefix][separator][text]
      • Un método formatBold(String text) que devuelve **[text]**
    • Una clase TextMessage que usa el mixin Formattable. Añade una propiedad String sender con un constructor. Incluye un método send(String content) que imprime el resultado de llamar a format() con [sender]: [content]
    • Una clase AlertMessage que también usa el mixin Formattable. Añade una propiedad String level con un constructor. Incluye un método alert(String content) que imprime el resultado de llamar a format() con [[level]] [formatBold(content)]
  • main.dart: Importa tu archivo de mensajería y muestra cómo ambos tipos de mensajes obtienen capacidades de formato del mixin:
    • Crea un TextMessage con el remitente 'Alice'
    • Crea un AlertMessage con el nivel '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 predeterminados, getters que calculan valores y varios métodos que incluso pueden llamarse entre sí. Ambas clases de mensajes obtienen toda esta funcionalidad simplemente usando la palabra clave with.

Salida esperada:

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

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

Practica por tu cuenta: Compilador de Dart online