Mengimplementasikan vs Memperluas
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 47 dari 110.
Sekarang setelah kamu memahami extends dan implements, mari kita perjelas kapan harus menggunakan masing-masing.
Gunakan extends saat kamu ingin mewarisi perilaku. Subclass-mu mendapatkan semua kode dari class induknya secara gratis dan dapat mengembangkannya:
class Animal {
void breathe() {
print('Breathing...');
}
}
class Dog extends Animal {
void bark() {
print('Woof!');
}
}
void main() {
var dog = Dog();
dog.breathe(); // Diwarisi, berfungsi secara otomatis
dog.bark();
}Gunakan implements saat kamu ingin menjamin sebuah struktur tanpa mewarisi kode. Kamu harus menulis setiap method sendiri:
class Robot implements Animal {
@override
void breathe() {
print('Ventilating circuits...'); // Implementasi yang sepenuhnya dibuat khusus
}
}Perbedaan utamanya: extends berarti "Aku adalah jenis dari ini", sedangkan implements berarti "Aku bisa melakukan hal yang dilakukan ini." Dog adalah Animal dan bernapas dengan cara yang sama. Robot bukan hewan, tetapi bisa memenuhi kontrak yang sama dengan logikanya sendiri.
Ingat: kamu hanya dapat mewarisi satu class, tetapi dapat mengimplementasikan banyak interface. Pilih extends untuk hubungan pewarisan yang sebenarnya, dan implements saat kamu membutuhkan fleksibilitas atau ingin menerapkan kontrak tanpa berbagi detail implementasi.
Tantangan
MudahMari kita buat sistem pekerja yang menunjukkan kapan harus menggunakan extends dibandingkan dengan implements. Kamu akan membuat class pekerja dasar, lalu menunjukkan kedua pendekatan: satu class yang benar-benar merupakan pekerja dan mewarisi perilaku, serta class lain yang hanya bisa melakukan hal yang dilakukan pekerja, tetapi dengan logika khusus sepenuhnya.
Kamu akan mengatur kodemu ke dalam dua file:
worker.dart: Definisikan hierarki pekerjamu di sini:- Class
Workerdengan propertyString namedan sebuah konstruktor. Sertakan methodwork()yang mencetak[name] is working...dan methodtakeBreak()yang mencetak[name] takes a coffee break - Class
OfficeWorkeryang extendsWorker. Tambahkan propertyString department. Overridework()agar mencetak[name] is typing reports in [department], tetapi pertahankan perilakutakeBreak()yang diwarisi - Class
RobotWorkeryang implementsWorker. Tambahkan propertyString model. Karena robot sebenarnya bukan pekerja, tetapi bisa melakukan hal yang dilakukan pekerja, berikan implementasi khusus sepenuhnya:work()harus mencetakRobot [model] is assembling partsdantakeBreak()harus mencetakRobot [model] is recharging
- Class
main.dart: Impor file pekerjamu dan tunjukkan kedua pendekatan:- Buat
OfficeWorkerbernama'Alice'di departemen'Marketing' - Buat
RobotWorkerdengan model'RX-7' - Untuk pekerja kantor, panggil
work(), lalutakeBreak() - Cetak baris kosong
- Untuk pekerja robot, panggil
work(), lalutakeBreak()
- Buat
Perhatikan bagaimana OfficeWorker mewarisi takeBreak() secara otomatis karena class ini me-extends Worker. Class ini benar-benar merupakan pekerja. Sementara itu, RobotWorker harus menyediakan implementasinya sendiri untuk semuanya karena class ini hanya meng-implements antarmuka. Class ini bisa melakukan hal yang dilakukan pekerja, tetapi dengan caranya sendiri sebagai robot.
Output yang diharapkan:
Alice is typing reports in Marketing
Alice takes a coffee break
Robot RX-7 is assembling parts
Robot RX-7 is rechargingCoba sendiri
import 'worker.dart';
void main() {
// TODO: Buat OfficeWorker bernama 'Alice' di departemen 'Marketing'
// TODO: Buat RobotWorker dengan model 'RX-7'
// TODO: Untuk pekerja kantor, panggil work() lalu takeBreak()
// TODO: Cetak baris kosong
// TODO: Untuk pekerja robot, panggil work() lalu takeBreak()
}
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