Menu
Coddy logo textTech

Sealed Sınıflar (Dart 3)

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 85 / 110.

Dart 3, hangi sınıfların onları genişletebileceğini veya uygulayabileceğini kısıtlayan sealed sınıfları (mühürlü sınıflar) getirdi. Bir sınıfı sealed olarak işaretlediğinizde, yalnızca aynı dosyadaki sınıflar onun doğrudan alt türleri olabilir. Bu, bilinen alt türlerden oluşan kapalı bir küme oluşturur.

sealed class Result {}

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

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

Sealed sınıfların gücü, kapsamlılık kontrolünden (exhaustiveness checking) gelir. Bir sealed tür üzerinde switch işlemi yaptığınızda, derleyici tüm olası alt türleri bilir ve her birini ele aldığınızdan emin olur:

String handleResult(Result result) {
  return switch (result) {
    Success(data: var d) => 'Got: $d',
    Failure(error: var e) => 'Error: $e',
  };
  // Varsayılan duruma gerek yok - derleyici tüm durumların kapsandığını biliyor!
}

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

Bir sealed class'a yeni bir alt tür eklerseniz, derleyici onu işlemeyen her switch ifadesini işaretleyecektir. Bu, sealed class'ları durumları, sonuçları veya sabit bir varyant kümesine sahip olduğunuz herhangi bir senaryoyu modellemek için ideal hale getirir. Abstract class'ların aksine, sealed class'lar hiçbir harici kodun beklenmedik alt türler ekleyemeyeceğini garanti eder.

challenge icon

Görev

Kolay

Mühürlü (sealed) sınıfları kullanarak bir ağ isteği işleyicisi oluşturalım! Bir ağ yanıtının farklı durumlarını modelleyen, her olası sonucun düzgün bir şekilde işlenmesini sağlayan tip güvenli bir sistem oluşturacaksınız.

Kodunuzu iki dosyada düzenleyeceksiniz:

  • response.dart: Bir ağ yanıtının tüm olası durumlarını temsil eden mühürlü bir sınıf hiyerarşisi oluşturun:
    • Tüm yanıt türleri için temel görevi gören NetworkResponse adında mühürlü bir sınıf
    • NetworkResponse sınıfını genişleten ve String message alanına (örneğin, "Fetching data...") sahip bir Loading sınıfı
    • NetworkResponse sınıfını genişleten, String data ve int statusCode alanlarına sahip bir Success sınıfı
    • NetworkResponse sınıfını genişleten, String errorMessage ve int errorCode alanlarına sahip bir Error sınıfı
  • main.dart: Yanıt dosyanızı içe aktarın ve bir switch ifadesi kullanarak tüm yanıt türlerini işleyen bir fonksiyon oluşturun:
    • String döndüren bir handleResponse(NetworkResponse response) fonksiyonu oluşturun
    • Her durumu işlemek için desen eşleme (pattern matching) içeren bir switch ifadesi kullanın:
      • Loading için: Status: [message] döndürün
      • Success için: Success ([statusCode]): [data] döndürün
      • Error için: Error ([errorCode]): [errorMessage] döndürün
    • Üç yanıt örneği oluşturun ve her birini işlemenin sonucunu yazdırın:
      • Please wait... mesajına sahip bir Loading
      • User profile loaded verisine ve 200 durum koduna sahip bir Success
      • Not found hata mesajına ve 404 hata koduna sahip bir Error

Mühürlü sınıfların güzelliği, derleyicinin her olası yanıt türünü işlemenizi sağlamasıdır - varsayılan (default) bir duruma gerek yoktur!

Beklenen çıktı:

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

Kopya kağıdı

Mühürlü (sealed) sınıflar, hangi sınıfların onları genişletebileceğini veya uygulayabileceğini kısıtlar. Yalnızca aynı dosyadaki sınıflar doğrudan alt türler olabilir, bu da bilinen varyantlardan oluşan kapalı bir küme oluşturur.

sealed class Result {}

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

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

Mühürlü sınıflar, switch ifadelerinde kapsamlılık (exhaustiveness) kontrolü sağlar. Derleyici tüm olası alt türleri bilir ve her birini ele aldığınızdan emin olur:

String handleResult(Result result) {
  return switch (result) {
    Success(data: var d) => 'Got: $d',
    Failure(error: var e) => 'Error: $e',
  };
  // No default case needed - all cases are covered
}

Yeni bir alt tür eklerseniz, derleyici onu işlemeyen her switch ifadesini işaretler. Bu, mühürlü sınıfları durumları, sonuçları veya tüm durumların ele alındığına dair derleme zamanı garantisi istediğiniz herhangi bir sabit varyant kümesini modellemek için ideal hale getirir.

Kendin dene

import 'response.dart';

// TODO: handleResponse(NetworkResponse response) fonksiyonunu oluşturun
// bir String döndüren
// Her durumu ele almak için desen eşleştirme (pattern matching) ile bir switch ifadesi kullanın:
// - Loading için: "Status: [message]" döndürün
// - Success için: "Success ([statusCode]): [data]" döndürün
// - Error için: "Error ([errorCode]): [errorMessage]" döndürün

void main() {
  // TODO: "Please wait..." mesajıyla bir Loading örneği oluşturun
  
  // TODO: "User profile loaded" verisi ve 200 durum koduyla bir Success örneği oluşturun
  
  // TODO: "Not found" hata mesajı ve 404 hata koduyla bir Error örneği oluşturun
  
  // TODO: Her bir yanıtın işlenme sonucunu yazdırın
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler