Mixin vs. Pewarisan
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 54 dari 110.
Sekarang setelah kamu mempelajari cara kerja mixin, mari kita perjelas kapan menggunakannya alih-alih pewarisan. Perbedaan utamanya terletak pada hubungan yang dinyatakannya.
Inheritance menggambarkan hubungan "is-a". Dog adalah Animal. Subclass adalah versi khusus dari parent, dan kamu hanya dapat mewarisi satu class.
Mixin, di sisi lain, menggambarkan hubungan "bisa melakukan". Dog bisa berenang, tetapi berenang bukanlah hal yang mendefinisikan seekor anjing.
// Pewarisan: Dog ADALAH Animal
class Animal {
String name;
Animal(this.name);
}
class Dog extends Animal {
Dog(String name) : super(name);
}
// Mixin: Dog BISA berenang (tetapi berenang bukan ciri yang mendefinisikannya)
mixin Swimming {
void swim() => print('Swimming');
}
class Dog extends Animal with Swimming {
Dog(String name) : super(name);
}Gunakan pewarisan saat beberapa class memiliki identitas dasar yang sama dan kamu memerlukan konstruktor di parent. Gunakan mixin saat kamu ingin menambahkan kemampuan ke class yang tidak memiliki leluhur yang sama.
| Fitur | Pewarisan | Mixin |
|---|---|---|
| Hubungan | adalah | dapat melakukan |
| Batasan | Hanya satu induk | Beberapa mixin |
| Konstruktor | Diizinkan | Tidak diizinkan |
| Kasus penggunaan | Spesialisasi | Perilaku bersama |
Bagian terbaiknya? Kamu bisa menggabungkan keduanya: mewarisi satu class dan mencampurkan beberapa kemampuan, sehingga class-mu memiliki fitur yang benar-benar dibutuhkan.
Tantangan
MudahMari buat sistem pekerja yang menunjukkan kapan sebaiknya menggunakan inheritance dibandingkan mixin. Kamu akan membuat class dasar untuk hubungan "is-a" dan mixin untuk kemampuan "can-do", lalu menggabungkan keduanya untuk menunjukkan cara kedua pendekatan ini bekerja bersama.
Kamu akan mengatur kodemu ke dalam tiga file:
worker.dart: Definisikan class dasar yang menetapkan identitas inti semua pekerja:- Class
Workerdengan propertyString namedanString department. Sertakan constructor yang menerima kedua nilai tersebut. Tambahkan methodintroduce()yang mencetak[name] works in [department]
- Class
skills.dart: Definisikan mixin yang mewakili kemampuan yang dapat dimiliki pekerja (hubungan "can-do"):- Mixin
CanCodedengan methodwriteCode()yang mencetakWriting code... - Mixin
CanDesigndengan methodcreateDesign()yang mencetakCreating design... - Mixin
CanManagedengan methodleadTeam()yang mencetakLeading the team...
- Mixin
main.dart: Impor kedua file dan buat tipe pekerja khusus yang menggabungkan inheritance dengan mixin:- Class
Developeryang memperluasWorkerdan menggunakan mixinCanCode - Class
TechLeadyang memperluasWorkerdan menggunakan mixinCanCodesertaCanManage - Buat
Developerbernama'Alice'di departemen'Engineering' - Buat
TechLeadbernama'Bob'di departemen'Engineering' - Untuk Alice: panggil
introduce(), laluwriteCode() - Cetak satu baris kosong
- Untuk Bob: panggil
introduce(), laluwriteCode(), kemudianleadTeam()
- Class
Perhatikan bahwa Developer dan TechLead sama-sama merupakan pekerja (inheritance), tetapi mereka dapat melakukan hal yang berbeda (mixin). TechLead menggabungkan beberapa kemampuan tanpa memerlukan multiple inheritance.
Output yang diharapkan:
Alice works in Engineering
Writing code...
Bob works in Engineering
Writing code...
Leading the team...Coba sendiri
import 'worker.dart';
import 'skills.dart';
// TODO: Buat class Developer yang mewarisi Worker dan menggunakan mixin CanCode
// TODO: Buat class TechLead yang mewarisi Worker dan menggunakan mixin CanCode serta CanManage
void main() {
// TODO: Buat Developer bernama 'Alice' di departemen 'Engineering'
// TODO: Panggil introduce(), lalu writeCode() untuk Alice
// TODO: Cetak baris kosong
// TODO: Buat TechLead bernama 'Bob' di departemen 'Engineering'
// TODO: Panggil introduce(), writeCode(), lalu leadTeam() untuk Bob
}
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