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.
Görev
KolayMü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
NetworkResponseadında mühürlü bir sınıf NetworkResponsesınıfını genişleten veString messagealanına (örneğin, "Fetching data...") sahip birLoadingsınıfıNetworkResponsesınıfını genişleten,String dataveint statusCodealanlarına sahip birSuccesssınıfıNetworkResponsesınıfını genişleten,String errorMessageveint errorCodealanlarına sahip birErrorsınıfı
- Tüm yanıt türleri için temel görevi gören
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:Stringdöndüren birhandleResponse(NetworkResponse response)fonksiyonu oluşturun- Her durumu işlemek için desen eşleme (pattern matching) içeren bir switch ifadesi kullanın:
Loadingiçin:Status: [message]döndürünSuccessiçin:Success ([statusCode]): [data]döndürünErroriç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 birLoadingUser profile loadedverisine ve200durum koduna sahip birSuccessNot foundhata mesajına ve404hata koduna sahip birError
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 foundKopya 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
}
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
1OOP Temelleri
Harici DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama13İleri Düzey OOP Kavramları
Kompozisyon ve KalıtımExtension MetotlarÇağrılabilir SınıflarSealed Sınıflar (Dart 3)Records (Dart 3)Desenler ve Eşleştirme (3.0)Metot İçeren Enum'lar2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı