Menu
Coddy logo textTech

Klasy zapieczętowane (Dart 3)

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 85 z 110.

Dart 3 wprowadził klasy zapieczętowane, które ograniczają, jakie klasy mogą je rozszerzać lub implementować. Gdy oznaczysz klasę jako sealed, tylko klasy z tego samego pliku mogą być jej bezpośrednimi podtypami. Tworzy to zamknięty zbiór znanych podtypów.

sealed class Result {}

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

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

Siła klas zapieczętowanych wynika ze sprawdzania wyczerpującego. Gdy używasz instrukcji switch dla typu zapieczętowanego, kompilator zna wszystkie możliwe podtypy i upewnia się, że obsługujesz każdy z nich:

String handleResult(Result result) {
  return switch (result) {
    Success(data: var d) => 'Got: $d',
    Failure(error: var e) => 'Error: $e',
  };
  // Nie potrzeba default — kompilator wie, że uwzględniono wszystkie przypadki!
}

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

Jeśli dodasz nowy podtyp do klasy zapieczętowanej, kompilator oznaczy każdą instrukcję switch, która go nie obsługuje. Dzięki temu klasy zapieczętowane idealnie nadają się do modelowania stanów, wyników lub dowolnego scenariusza, w którym masz stały zestaw wariantów. W przeciwieństwie do klas abstrakcyjnych klasy zapieczętowane gwarantują, że żaden zewnętrzny kod nie może dodać nieoczekiwanych podtypów.

challenge icon

Wyzwanie

Łatwy

Zbudujmy obsługę żądań sieciowych przy użyciu klas zapieczętowanych! Utworzysz bezpieczny typowo system, który modeluje różne stany odpowiedzi sieciowej, zapewniając prawidłową obsługę każdego możliwego wyniku.

Podzielisz kod na dwa pliki:

  • response.dart: Utwórz hierarchię klas zapieczętowanych, która reprezentuje wszystkie możliwe stany odpowiedzi sieciowej:
    • Klasę zapieczętowaną o nazwie NetworkResponse, która służy jako klasa bazowa dla wszystkich typów odpowiedzi
    • Klasę Loading, która rozszerza NetworkResponse o pole String message (np. "Fetching data...")
    • Klasę Success, która rozszerza NetworkResponse o pole String data oraz pole int statusCode
    • Klasę Error, która rozszerza NetworkResponse o pole String errorMessage oraz pole int errorCode
  • main.dart: Zaimportuj plik z odpowiedzią i utwórz funkcję, która obsługuje wszystkie typy odpowiedzi za pomocą wyrażenia switch:
    • Utwórz funkcję handleResponse(NetworkResponse response), która zwraca String
    • Użyj wyrażenia switch z dopasowywaniem do wzorca, aby obsłużyć każdy przypadek:
      • Dla Loading: zwróć Status: [message]
      • Dla Success: zwróć Success ([statusCode]): [data]
      • Dla Error: zwróć Error ([errorCode]): [errorMessage]
    • Utwórz trzy instancje odpowiedzi i wypisz wynik obsługi każdej z nich:
      • Loading z komunikatem Please wait...
      • Success z danymi User profile loaded i kodem stanu 200
      • Error z komunikatem błędu Not found i kodem błędu 404

Zaletą klas zapieczętowanych jest to, że kompilator dopilnuje obsłużenia każdego możliwego typu odpowiedzi — nie jest potrzebny przypadek domyślny!

Oczekiwany wynik:

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

Spróbuj swoich sił

import 'response.dart';

// TODO: Utwórz funkcję handleResponse(NetworkResponse response)
// która zwraca String
// Użyj wyrażenia switch z dopasowaniem wzorców, aby obsłużyć każdy przypadek:
// - Dla Loading: zwróć "Status: [message]"
// - Dla Success: zwróć "Success ([statusCode]): [data]"
// - Dla Error: zwróć "Error ([errorCode]): [errorMessage]"

void main() {
  // TODO: Utwórz instancję Loading z komunikatem "Please wait..."
  
  // TODO: Utwórz instancję Success z danymi "User profile loaded" i kodem statusu 200
  
  // TODO: Utwórz instancję Error z komunikatem błędu "Not found" i kodem błędu 404
  
  // TODO: Wypisz wynik obsługi każdej odpowiedzi
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online