Anotasi @override
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 39 dari 110.
Anotasi @override adalah penanda praktik terbaik yang memberi tahu Dart (dan developer lain) bahwa kamu sengaja mengganti method dari class induk. Meskipun method overriding tetap berfungsi tanpanya, menggunakan @override memberikan lapisan keamanan yang penting.
class Animal {
String name;
Animal(this.name);
void speak() {
print('$name makes a sound');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
@override
void speak() {
print('$name barks: Woof!');
}
}Anotasi ini memberikan dua manfaat utama. Pertama, anotasi ini mendokumentasikan tujuanmu dengan jelas, siapa pun yang membaca kode akan langsung tahu bahwa method ini ada di class induk. Kedua, analyzer Dart akan memberi peringatan jika method induk sebenarnya tidak ada, sehingga kesalahan ketik dan kesalahan saat melakukan refactoring dapat diketahui lebih awal.
Pertimbangkan apa yang terjadi jika kamu salah mengeja nama method tanpa @override:
class Cat extends Animal {
Cat(String name) : super(name);
void speek() { // Salah ketik! Tidak ada peringatan tanpa @override
print('$name meows');
}
}Tanpa anotasi, Dart menganggap kamu sedang membuat method baru bernama speek(). Dengan @override, analyzer akan langsung menandai bahwa method seperti itu tidak ada di class induk. Anotasi sederhana ini mencegah bug terselubung yang mungkin sulit dilacak nanti.
Tantangan
MudahMari bangun sistem pemutar media yang menunjukkan pentingnya anotasi @override saat menyesuaikan perilaku yang diwariskan. Kamu akan membuat berbagai tipe media yang masing-masing memutar konten dengan caranya sendiri.
Kamu akan mengatur kodemu dalam dua file:
media.dart: Definisikan hierarki media di sini:- class
Mediadengan propertyString title, konstruktor yang menerima title, dan methodplay()yang mencetakPlaying: [title] - class
Songyang memperluasMediadan menambahkan propertyString artist. Gunakan anotasi@overridedan overrideplay()untuk mencetakPlaying song: [title] by [artist] - class
Videoyang memperluasMediadan menambahkan propertyint duration(dalam detik). Gunakan@overridedan overrideplay()untuk terlebih dahulu memanggil versi milik parent dengansuper.play(), lalu mencetakDuration: [duration] seconds
- class
main.dart: Impor file media-mu dan tunjukkan method yang dioverride:- Buat object
Mediadengan title'Generic Content'dan panggilplay() - Cetak satu baris kosong
- Buat
Songdengan title'Imagine'dan artist'John Lennon', lalu panggilplay() - Cetak satu baris kosong
- Buat
Videodengan title'Dart Tutorial'dan duration360, lalu panggilplay()
- Buat object
Anotasi @override mendokumentasikan maksudmu dan membantu menemukan error. Jika kamu tidak sengaja salah mengeja play() menjadi plya(), anotasi tersebut akan memberi tahu bahwa method seperti itu tidak ada di parent class.
Output yang diharapkan:
Playing: Generic Content
Playing song: Imagine by John Lennon
Playing: Dart Tutorial
Duration: 360 secondsCoba sendiri
import 'media.dart';
void main() {
// TODO: Buat object Media dengan judul 'Generic Content', lalu panggil play()
// TODO: Cetak satu baris kosong
// TODO: Buat Song dengan judul 'Imagine' dan artis 'John Lennon', lalu panggil play()
// TODO: Cetak satu baris kosong
// TODO: Buat Video dengan judul 'Dart Tutorial' dan durasi 360, lalu panggil play()
}
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