Sealed class (Dart 3)
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 85 dari 110.
Dart 3 memperkenalkan sealed classes, yang membatasi class mana saja yang dapat memperluas atau mengimplementasikannya. Saat kamu menandai sebuah class sebagai sealed, hanya class dalam file yang sama yang dapat menjadi subtipe langsungnya. Ini membentuk himpunan tertutup dari subtipe yang diketahui.
sealed class Result {}
class Success extends Result {
final String data;
Success(this.data);
}
class Failure extends Result {
final String error;
Failure(this.error);
}Kekuatan sealed class berasal dari pemeriksaan kelengkapan. Saat kamu menggunakan percabangan pada tipe sealed, compiler mengetahui semua subtype yang mungkin dan memastikan kamu menangani setiap subtype:
String handleResult(Result result) {
return switch (result) {
Success(data: var d) => 'Got: $d',
Failure(error: var e) => 'Error: $e',
};
// Tidak perlu default, compiler tahu semua kasus sudah tercakup!
}
void main() {
var success = Success('Hello');
var failure = Failure('Not found');
print(handleResult(success)); // Got: Hello
print(handleResult(failure)); // Error: Not found
}Jika kamu menambahkan subtype baru ke sealed class, compiler akan menandai setiap pernyataan switch yang tidak menanganinya. Hal ini membuat sealed class ideal untuk memodelkan status, hasil, atau skenario apa pun yang memiliki sekumpulan varian tetap. Berbeda dengan abstract class, sealed class menjamin bahwa tidak ada kode eksternal yang dapat menambahkan subtype tak terduga.
Tantangan
MudahMari kita buat penangan permintaan jaringan menggunakan sealed class! Kamu akan membuat sistem bertipe aman yang memodelkan berbagai status respons jaringan, sehingga setiap kemungkinan hasil ditangani dengan benar.
Kamu akan mengatur kodemu ke dalam dua file:
response.dart: Buat hierarki sealed class yang mewakili semua kemungkinan status respons jaringan:- Sealed class bernama
NetworkResponseyang menjadi dasar bagi semua tipe respons - Class
Loadingyang memperluasNetworkResponsedengan fieldString message(misalnya, "Fetching data...") - Class
Successyang memperluasNetworkResponsedengan fieldString datadan fieldint statusCode - Class
Erroryang memperluasNetworkResponsedengan fieldString errorMessagedan fieldint errorCode
- Sealed class bernama
main.dart: Impor file responsmu dan buat fungsi yang menangani semua tipe respons menggunakan ekspresi switch:- Buat fungsi
handleResponse(NetworkResponse response)yang mengembalikanString - Gunakan ekspresi switch dengan pencocokan pola untuk menangani setiap kasus:
- Untuk
Loading: kembalikanStatus: [message] - Untuk
Success: kembalikanSuccess ([statusCode]): [data] - Untuk
Error: kembalikanError ([errorCode]): [errorMessage]
- Untuk
- Buat tiga instance respons dan cetak hasil penanganan masing-masing:
Loadingdengan pesanPlease wait...Successdengan dataUser profile loadeddan kode status200Errordengan pesan errorNot founddan kode error404
- Buat fungsi
Keunggulan sealed class adalah compiler memastikan kamu menangani setiap kemungkinan tipe respons, jadi kamu tidak memerlukan kasus default!
Output yang diharapkan:
Status: Please wait...
Success (200): User profile loaded
Error (404): Not foundCoba sendiri
import 'response.dart';
// TODO: Buat fungsi handleResponse(NetworkResponse response)
// yang mengembalikan String
// Gunakan ekspresi switch dengan pencocokan pola untuk menangani setiap kasus:
// - Untuk Loading: kembalikan "Status: [message]"
// - Untuk Success: kembalikan "Success ([statusCode]): [data]"
// - Untuk Error: kembalikan "Error ([errorCode]): [errorMessage]"
void main() {
// TODO: Buat instance Loading dengan message "Please wait..."
// TODO: Buat instance Success dengan data "User profile loaded" dan kode status 200
// TODO: Buat instance Error dengan errorMessage "Not found" dan errorCode 404
// TODO: Cetak hasil penanganan setiap respons
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
file Eksternallibrary dan ImporPengantar OOPClass dan ObjectKata kunci thismethodVariabel InstanceDasar-Dasar ConstructorRingkasan: Kalkulator Sederhana4Keamanan Null
Pengantar Keamanan NullBisa Null vs Tidak Bisa NullOperator ? dan !Kata Kunci late dan Keamanan NullOperator Penanganan NullKeamanan Null dalam classRangkuman: Sistem Profil Pengguna7class Abstrak & Antarmuka
class AbstrakMethod abstrakAntarmuka di DartAntarmuka ImplisitMengimplementasikan vs MemperluasBeberapa AntarmukaRingkasan: Kalkulator Bentuk10Koleksi dan Generik
Gambaran Umum list, set, dan MapKoleksi dengan Tipe AmanKelas GenerikMetode GenerikBatasan GenerikIterable dan IteratorUlasan: Penyimpanan Generik13Konsep OOP Lanjutan
Komposisi vs PewarisanExtension methodClass yang Dapat DipanggilSealed class (Dart 3)Records (Dart 3)Pola dan Pencocokan (3.0)Enum dengan method2Konstruktor dalam Dart
Konstruktor DefaultKonstruktor BernamaInitializer ListsKonstruktor KonstanKonstruktor FactoryKonstruktor RedirectingRangkuman, Pembuat Bentuk5Enkapsulasi
Member Publik vs PrivatKonvensi Prefiks _Privasi Tingkat libraryPendalaman Getter & SetterPenyembunyian InformasiRingkasan: Catatan Siswa8Mixin
Pengantar MixinMembuat MixinMenggunakan Beberapa MixinKata Kunci on pada MixinMixin vs. PewarisanMixin vs. InterfaceRangkuman: Sistem Hewan3Property Class
Anggota Instance vs StaticField Final dan ConstVariabel LateMethod dan Field StaticGetter dan SetterRangkuman: Pengelola Rekening Bank6Pewarisan
Pewarisan DasarKata Kunci superPenimpaan methodAnotasi @overrideKata Kunci class finalKonstruktor dan PewarisanRangkuman, Hierarki Karyawan9Polimorfisme
Dasar-Dasar PolimorfismePolimorfisme melalui AntarmukaPemeriksaan Tipe saat RuntimeOperator is & asKata Kunci KovarianRangkuman: Pemroses PembayaranLatihan sendiri: Compiler Dart online