Antarmuka Implisit
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 46 dari 110.
Karena setiap class Dart secara otomatis mendefinisikan interface, kamu dapat menggunakan class apa pun sebagai interface, bahkan class konkret dengan implementasi lengkap. Inilah yang kami sebut interface implisit.
Pertimbangkan sebuah class dengan property dan method:
class Logger {
String prefix = '[LOG]';
void log(String message) {
print('$prefix $message');
}
void clear() {
print('Clearing logs...');
}
}Saat class lain mengimplementasikan Logger, class tersebut harus menyediakan implementasinya sendiri untuk semuanya, termasuk property prefix:
class FileLogger implements Logger {
@override
String prefix = '[FILE]';
@override
void log(String message) {
print('$prefix Writing to file: $message');
}
@override
void clear() {
print('Deleting log file...');
}
}Inilah wawasan utamanya: saat kamu menggunakan implements, kamu mengatakan, "class-ku akan memiliki bentuk yang sama", yaitu method dan property yang sama. Kamu tidak mewarisi kode, constructor, atau nilai default apa pun. Kamu hanya berjanji untuk mengikuti struktur interface.
Hal ini membuat interface implisit sangat berguna untuk membuat komponen yang dapat saling dipertukarkan. Kode yang mengharapkan Logger dapat bekerja dengan class apa pun yang mengimplementasikan interfacenya, terlepas dari cara kerja implementasi tersebut secara internal.
Tantangan
MudahMari buat sistem notifikasi yang menunjukkan bagaimana class konkret dapat berfungsi sebagai interface implisit. Kamu akan membuat class notifikasi dasar, lalu mengimplementasikannya dengan cara yang benar-benar berbeda, untuk menunjukkan bahwa implements mengharuskan kamu menyediakan semua anggotanya sendiri.
Kamu akan mengatur kodemu dalam dua file:
notification.dart: Definisikan class notifikasimu di sini:- Class
Notificationdengan propertyString channelyang nilainya ditetapkan ke'default', methodsend(String message)yang mencetak[channel]: [message], dan methodgetStatus()yang mengembalikan string'Notification ready' - Class
EmailNotificationyang mengimplementasikanNotification. Karena kamu menggunakanimplements, kamu harus menyediakan propertychannelsendiri (tetapkan nilainya ke'email'), methodsend()sendiri yang mencetakSending email: [message], dan methodgetStatus()sendiri yang mengembalikan'Email service active' - Class
PushNotificationyang mengimplementasikanNotification. Tetapkanchannel-nya ke'push', buatsend()mencetakPush alert: [message], dan buatgetStatus()mengembalikan'Push service connected'
- Class
main.dart: Impor file notifikasimu dan tunjukkan bagaimana class yang berbeda dapat mengimplementasikan interface implisit yang sama dengan perilaku yang benar-benar berbeda:- Buat sebuah
EmailNotificationdan sebuahPushNotification - Untuk setiap notifikasi, cetak statusnya menggunakan
getStatus(), lalu panggilsend()dengan pesan'Hello World' - Cetak satu baris kosong di antara kedua notifikasi
- Buat sebuah
Ingat: saat menggunakan implements, kamu tidak mewarisi kode apa pun dari Notification. Kamu hanya menjanjikan bahwa class-mu akan memiliki bentuk yang sama, yaitu property dan method yang sama. Setiap class yang mengimplementasikannya menyediakan implementasi lengkapnya sendiri.
Output yang diharapkan:
Email service active
Sending email: Hello World
Push service connected
Push alert: Hello WorldCoba sendiri
import 'notification.dart';
void main() {
// TODO: Buat instance EmailNotification
// TODO: Cetak status notifikasi email menggunakan getStatus()
// TODO: Kirim pesan 'Hello World' menggunakan notifikasi email
// TODO: Cetak baris kosong
// TODO: Buat instance PushNotification
// TODO: Cetak status notifikasi push menggunakan getStatus()
// TODO: Kirim pesan 'Hello World' menggunakan notifikasi push
}
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