Menu
Coddy logo textTech

Classi sealed (Dart 3)

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 85 di 110.

Dart 3 ha introdotto le classi sealed, che limitano le classi che possono estenderle o implementarle. Quando contrassegni una classe come sealed, solo le classi nello stesso file possono esserne sottotipi diretti. Questo crea un insieme chiuso di sottotipi noti.

sealed class Result {}

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

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

La potenza delle classi sealed deriva dal controllo di esaustività. Quando esegui uno switch su un tipo sealed, il compilatore conosce tutti i possibili sottotipi e si assicura che tu li gestisca tutti:

String handleResult(Result result) {
  return switch (result) {
    Success(data: var d) => 'Got: $d',
    Failure(error: var e) => 'Error: $e',
  };
  // Non serve un caso default: il compilatore sa che tutti i casi sono coperti!
}

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

Se aggiungi un nuovo sottotipo a una classe sealed, il compilatore segnalerà ogni istruzione switch che non lo gestisce. Questo rende le classi sealed ideali per modellare stati, risultati o qualsiasi scenario in cui hai un insieme fisso di varianti. A differenza delle classi astratte, le classi sealed garantiscono che nessun codice esterno possa aggiungere sottotipi imprevisti.

challenge icon

Sfida

Facile

Costruiamo un gestore di richieste di rete usando le classi sealed! Creerai un sistema type-safe che modella i diversi stati di una risposta di rete, assicurandoti che ogni possibile esito venga gestito correttamente.

Organizzerai il codice in due file:

  • response.dart: crea una gerarchia di classi sealed che rappresenti tutti i possibili stati di una risposta di rete:
    • Una classe sealed chiamata NetworkResponse che funge da base per tutti i tipi di risposta
    • Una classe Loading che estende NetworkResponse e include un campo String message (ad es., "Fetching data...")
    • Una classe Success che estende NetworkResponse e include un campo String data e un campo int statusCode
    • Una classe Error che estende NetworkResponse e include un campo String errorMessage e un campo int errorCode
  • main.dart: importa il tuo file delle risposte e crea una funzione che gestisca tutti i tipi di risposta usando un'espressione switch:
    • Crea una funzione handleResponse(NetworkResponse response) che restituisca una String
    • Usa un'espressione switch con il pattern matching per gestire ogni caso:
      • Per Loading: restituisci Status: [message]
      • Per Success: restituisci Success ([statusCode]): [data]
      • Per Error: restituisci Error ([errorCode]): [errorMessage]
    • Crea tre istanze di risposta e stampa il risultato della gestione di ciascuna:
      • Una Loading con il messaggio Please wait...
      • Una Success con i dati User profile loaded e il codice di stato 200
      • Un Error con il messaggio di errore Not found e il codice di errore 404

Il bello delle classi sealed è che il compilatore si assicura che tu gestisca ogni possibile tipo di risposta: non serve alcun caso predefinito!

Output previsto:

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

Provalo tu

import 'response.dart';

// TODO: Crea una funzione handleResponse(NetworkResponse response)
// che restituisca una String
// Usa un'espressione switch con pattern matching per gestire ogni caso:
// - Per Loading: restituisci "Status: [message]"
// - Per Success: restituisci "Success ([statusCode]): [data]"
// - Per Error: restituisci "Error ([errorCode]): [errorMessage]"

void main() {
  // TODO: Crea un'istanza di Loading con message "Please wait..."
  
  // TODO: Crea un'istanza di Success con data "User profile loaded" e codice di stato 200
  
  // TODO: Crea un'istanza di Error con errorMessage "Not found" e errorCode 404
  
  // TODO: Stampa il risultato della gestione di ogni risposta
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Dart online