Menu
CoddyTech

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 otomatis

Jadi, 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.

FiturInterfaceMixin
MenyediakanHanya kontrakKontrak + kode
ImplementasiKamu menulisnyaDisertakan
Kata kunciimplementswith
Paling cocok untukPerilaku berbeda, API samaPerilaku 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
}
challenge icon

Tantangan

Mudah

Mari 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 class Notifiable yang berfungsi sebagai antarmuka. Class ini harus mendeklarasikan dua method abstrak: send(String message) dan getChannel() yang mengembalikan String. Jenis notifikasi yang berbeda akan mengimplementasikan method ini secara berbeda sesuai dengan channel masing-masing.
  • logging.dart: Buat mixin Logging yang menyediakan perilaku bersama yang harus dimiliki semua notifikasi. Sertakan method logSent(String channel, String message) yang mencetak [LOG] Sent via [channel]: [message] dan method logTimestamp() 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 EmailNotification yang menggunakan mixin Logging dan mengimplementasikan Notifiable. Method getChannel() harus mengembalikan 'Email', sedangkan method send() harus mencetak Sending email: [message], lalu memanggil logSent() dengan channel dan message, kemudian memanggil logTimestamp()
    • Class SMSNotification yang menggunakan mixin Logging dan mengimplementasikan Notifiable. Method getChannel() harus mengembalikan 'SMS', sedangkan method send() harus mencetak Sending SMS: [message], lalu memanggil logSent() dengan channel dan message, kemudian memanggil logTimestamp()
    Lalu buat object EmailNotification dan panggil send('Hello World'), cetak baris kosong, buat object SMSNotification dan panggil send('Quick update')

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 recorded

Coba 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')
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Dart online