Mixin vs. Interface
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 55 dari 110.
Kamu sudah melihat perbandingan mixin dengan pewarisan. Sekarang, mari kita bandingkan mixin dengan interface, karena keduanya memungkinkan kamu bekerja dengan beberapa tipe. Perbedaan utamanya terletak pada hal yang disediakan: interface mendefinisikan kontrak, sedangkan mixin menyediakan implementasi.
Saat mengimplementasikan sebuah interface, kamu berjanji untuk menyediakan method tertentu, tetapi kamu menulis semua kodenya sendiri. Saat menggunakan mixin, kamu mendapatkan kode sebenarnya secara cuma-cuma.
// Pendekatan interface: kamu harus mengimplementasikan semuanya
abstract class Printable {
void printInfo();
}
class Report implements Printable {
@override
void printInfo() {
print('Printing report...'); // Kamu yang menulis ini
}
}
// Pendekatan mixin: implementasinya sudah tersedia
mixin Printable {
void printInfo() {
print('Printing...'); // Sudah ditulis untukmu
}
}
class Report with Printable {} // Mendapatkan printInfo() secara otomatisJadi, kapan kamu harus menggunakan masing-masing? Gunakan interface saat class yang berbeda memerlukan signature method yang sama, tetapi implementasinya berbeda. Gunakan mixin saat class harus berbagi perilaku yang sama persis.
| Fitur | Interface | Mixin |
|---|---|---|
| Menyediakan | Hanya kontrak | Kontrak + kode |
| Implementasi | Kamu menulisnya | Disertakan |
| Kata kunci | implements | with |
| Paling cocok untuk | Perilaku berbeda, API sama | Perilaku bersama |
Kamu bahkan bisa menggabungkan kedua pendekatan, gunakan interface untuk menentukan apa yang dapat dilakukan class, dan mixin untuk menyediakan implementasi umum jika sesuai. Di Dart, saat menggabungkan keduanya, selalu letakkan with sebelum implements:
class MyClass with SomeMixin implements SomeInterface {
// with muncul sebelum implements
}Tantangan
MudahMari kita bangun sistem notifikasi yang menunjukkan kapan sebaiknya menggunakan antarmuka dan kapan sebaiknya menggunakan mixin. Kamu akan membuat antarmuka untuk notifikasi yang memerlukan implementasi berbeda, serta mixin untuk perilaku pencatatan bersama yang harus sama untuk semua jenis notifikasi.
Kamu akan menyusun kodemu ke dalam tiga file:
notifiable.dart: Definisikan abstract classNotifiableyang berfungsi sebagai antarmuka. Class ini harus mendeklarasikan dua method abstrak:send(String message)dangetChannel()yang mengembalikanString. Jenis notifikasi yang berbeda akan mengimplementasikan method ini secara berbeda sesuai dengan channel masing-masing.logging.dart: Buat mixinLoggingyang menyediakan perilaku bersama yang harus dimiliki semua notifikasi. Sertakan methodlogSent(String channel, String message)yang mencetak[LOG] Sent via [channel]: [message]dan methodlogTimestamp()yang mencetak[LOG] Timestamp recorded. Perilaku ini sama untuk semua jenis notifikasi, sehingga cocok menggunakan mixin.main.dart: Impor kedua file dan buat dua class notifikasi yang menggabungkan antarmuka dengan mixin:- Class
EmailNotificationyang menggunakan mixinLoggingdan mengimplementasikanNotifiable. MethodgetChannel()harus mengembalikan'Email', sedangkan methodsend()harus mencetakSending email: [message], lalu memanggillogSent()dengan channel dan message, kemudian memanggillogTimestamp() - Class
SMSNotificationyang menggunakan mixinLoggingdan mengimplementasikanNotifiable. MethodgetChannel()harus mengembalikan'SMS', sedangkan methodsend()harus mencetakSending SMS: [message], lalu memanggillogSent()dengan channel dan message, kemudian memanggillogTimestamp()
EmailNotificationdan panggilsend('Hello World'), cetak baris kosong, buat objectSMSNotificationdan panggilsend('Quick update')- Class
Perhatikan bahwa antarmuka mengharuskan setiap class menulis implementasinya sendiri untuk send() dan getChannel() (perilaku berbeda), sedangkan mixin menyediakan method pencatatan yang bekerja sama untuk keduanya (perilaku bersama).
Output yang diharapkan:
Sending email: Hello World
[LOG] Sent via Email: Hello World
[LOG] Timestamp recorded
Sending SMS: Quick update
[LOG] Sent via SMS: Quick update
[LOG] Timestamp recordedCoba sendiri
import 'notifiable.dart';
import 'logging.dart';
// TODO: Buat class EmailNotification yang:
// - menggunakan mixin Logging (with)
// - mengimplementasikan Notifiable (implements)
// - getChannel() mengembalikan 'Email'
// - send() mencetak 'Sending email: [message]', lalu memanggil logSent(), kemudian logTimestamp()
// TODO: Buat class SMSNotification yang:
// - menggunakan mixin Logging (with)
// - mengimplementasikan Notifiable (implements)
// - getChannel() mengembalikan 'SMS'
// - send() mencetak 'Sending SMS: [message]', lalu memanggil logSent(), kemudian logTimestamp()
void main() {
// TODO: Buat EmailNotification dan panggil send('Hello World')
// TODO: Cetak baris kosong
// TODO: Buat SMSNotification dan panggil send('Quick update')
}
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