Menu
Coddy logo textTech

Clases selladas (Dart 3)

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy. Lección 85 de 110.

Dart 3 introdujo las clases selladas, las cuales restringen qué clases pueden extenderlas o implementarlas. Cuando marcas una clase como sealed, solo las clases en el mismo archivo pueden ser sus subtipos directos. Esto crea un conjunto cerrado de subtipos conocidos.

sealed class Result {}

class Success extends Result {
  final String data;
  Success(this.data);
}

class Failure extends Result {
  final String error;
  Failure(this.error);
}

El poder de las clases selladas proviene de la comprobación de exhaustividad. Cuando realizas un switch sobre un tipo sellado, el compilador conoce todos los subtipos posibles y garantiza que manejes cada uno de ellos:

String handleResult(Result result) {
  return switch (result) {
    Success(data: var d) => 'Got: $d',
    Failure(error: var e) => 'Error: $e',
  };
  // ¡No se necesita un caso por defecto - el compilador sabe que todos los casos están cubiertos!
}

void main() {
  var success = Success('Hello');
  var failure = Failure('Not found');
  
  print(handleResult(success));  // Got: Hello
  print(handleResult(failure));  // Error: Not found
}

Si añades un nuevo subtipo a una clase sellada, el compilador señalará cada instrucción switch que no lo gestione. Esto hace que las clases selladas sean ideales para modelar estados, resultados o cualquier escenario en el que tengas un conjunto fijo de variantes. A diferencia de las clases abstractas, las clases selladas garantizan que ningún código externo pueda añadir subtipos inesperados.

challenge icon

Desafío

Fácil

¡Construyamos un controlador de solicitudes de red usando clases selladas! Crearás un sistema con seguridad de tipos que modela diferentes estados de una respuesta de red, garantizando que cada resultado posible se gestione correctamente.

Organizarás tu código en dos archivos:

  • response.dart: Crea una jerarquía de clases selladas que represente todos los estados posibles de una respuesta de red:
    • Una clase sellada llamada NetworkResponse que sirve como base para todos los tipos de respuesta
    • Una clase Loading que extiende NetworkResponse con un campo String message (por ejemplo, "Fetching data...")
    • Una clase Success que extiende NetworkResponse con un campo String data y un campo int statusCode
    • Una clase Error que extiende NetworkResponse con un campo String errorMessage y un campo int errorCode
  • main.dart: Importa tu archivo de respuesta y crea una función que gestione todos los tipos de respuesta usando una expresión switch:
    • Crea una función handleResponse(NetworkResponse response) que devuelva un String
    • Usa una expresión switch con coincidencia de patrones para gestionar cada caso:
      • Para Loading: devuelve Status: [message]
      • Para Success: devuelve Success ([statusCode]): [data]
      • Para Error: devuelve Error ([errorCode]): [errorMessage]
    • Crea tres instancias de respuesta e imprime el resultado de gestionar cada una:
      • Un Loading con el mensaje Please wait...
      • Un Success con los datos User profile loaded y el código de estado 200
      • Un Error con el mensaje de error Not found y el código de error 404

¡La ventaja de las clases selladas es que el compilador garantiza que gestiones todos los tipos de respuesta posibles; no se necesita ningún caso predeterminado!

Salida esperada:

Status: Please wait...
Success (200): User profile loaded
Error (404): Not found

Pruébalo tú mismo

import 'response.dart';

// TODO: Crea una función handleResponse(NetworkResponse response)
// que devuelva un String
// Usa una expresión switch con coincidencia de patrones (pattern matching) para manejar cada caso:
// - Para Loading: devuelve "Status: [message]"
// - Para Success: devuelve "Success ([statusCode]): [data]"
// - Para Error: devuelve "Error ([errorCode]): [errorMessage]"

void main() {
  // TODO: Crea una instancia de Loading con el mensaje "Please wait..."
  
  // TODO: Crea una instancia de Success con los datos "User profile loaded" y el código de estado 200
  
  // TODO: Crea una instancia de Error con el mensaje de error "Not found" y el código de error 404
  
  // TODO: Imprime el resultado de manejar cada respuesta
}
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