Kata Kunci class final
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 40 dari 110.
Terkadang kamu ingin mencegah sebuah class diperluas. Kata kunci final, saat diterapkan pada class, mencegah class lain mewarisinya.
final class DatabaseConnection {
String connectionString;
DatabaseConnection(this.connectionString);
void connect() {
print('Connected to $connectionString');
}
}
// Ini akan menyebabkan error saat compile:
// class CustomConnection extends DatabaseConnection { }Menandai class sebagai final berguna ketika memperluasnya dapat merusak perilaku yang diharapkan atau jaminan keamanannya. Misalnya, class yang mengelola sumber daya sensitif mungkin perlu memastikan method-nya tidak di-override dengan cara yang tidak terduga.
Dart 3 juga memperkenalkan modifier terkait: base memaksa subclass menggunakan extends (bukan implements), dan sealed membatasi pewarisan hanya ke library yang sama. Untuk saat ini, fokuslah pada final sebagai cara paling sederhana untuk mengunci class sepenuhnya.
Gunakan class final jika kamu yakin desain class sudah lengkap dan pewarisan hanya akan menimbulkan masalah. Namun, jangan terlalu sering menggunakannya. Sebagian besar class sebaiknya tetap terbuka untuk diperluas.
Tantangan
MudahMari kita bangun sistem konfigurasi yang aman untuk menunjukkan kapan dan mengapa kamu perlu mencegah sebuah class diperluas. Kamu akan membuat class final yang mengelola pengaturan aplikasi, sehingga perilakunya tidak dapat diubah melalui pewarisan.
Kamu akan mengatur kodemu dalam dua file:
config.dart: Definisikan class konfigurasi di sini:final class AppConfigyang tidak dapat diperluas. Class ini harus memiliki propertyString appNamedanString version, constructor yang menerima kedua nilai, serta methoddisplay()yang mencetak[appName] v[version]- Class
Featurebiasa, bukan final, dengan propertyString namedanbool enabled, constructor untuk keduanya, serta methodstatus()yang mencetak[name]: [enabled ? 'ON' : 'OFF'] - Class
ExperimentalFeatureyang memperluasFeaturedan menambahkan propertyString warning. Overridestatus()menggunakan@overrideuntuk memanggil versi milik parent terlebih dahulu dengansuper.status(), lalu mencetakWarning: [warning]
main.dart: Import file konfigurasi dan tunjukkan perbedaan antara class final dan class biasa:- Buat
AppConfigdengan appName'MyApp'dan version'2.0.1', lalu panggildisplay() - Cetak satu baris kosong
- Buat
Featuredengan name'Dark Mode'dan enabledtrue, lalu panggilstatus() - Cetak satu baris kosong
- Buat
ExperimentalFeaturedengan name'AI Assistant', enabledfalse, dan warning'May be unstable', lalu panggilstatus()
- Buat
Perhatikan bahwa AppConfig ditandai sebagai final karena perilaku konfigurasinya harus tetap konsisten dan aman. Tidak ada subclass yang boleh mengubah cara pengaturan dikelola. Sementara itu, Feature tetap terbuka untuk diperluas, sehingga ExperimentalFeature dapat menambahkan perilaku khusus.
Output yang diharapkan:
MyApp v2.0.1
Dark Mode: ON
AI Assistant: OFF
Warning: May be unstableCoba sendiri
import 'config.dart';
void main() {
// TODO: Buat AppConfig dengan appName 'MyApp' dan version '2.0.1'
// Lalu panggil display()
// TODO: Cetak baris kosong
// TODO: Buat Feature dengan name 'Dark Mode' dan enabled true
// Lalu panggil status()
// TODO: Cetak baris kosong
// TODO: Buat ExperimentalFeature dengan name 'AI Assistant',
// enabled false, dan warning 'May be unstable'
// Lalu panggil status()
}
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 Generik2Konstruktor 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