Polimorfisme melalui Antarmuka
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 58 dari 110.
Di pelajaran sebelumnya, kamu melihat polimorfisme melalui pewarisan, yaitu menggunakan tipe parent class untuk bekerja dengan object child. Namun, polimorfisme juga bekerja melalui interface, dan pendekatan ini sering kali lebih fleksibel.
Saat class mengimplementasikan interface yang sama, kamu dapat memperlakukannya secara polimorfik meskipun class tersebut tidak memiliki hubungan pewarisan:
abstract class Printable {
void printDetails();
}
class Invoice implements Printable {
@override
void printDetails() => print('Invoice #1234');
}
class Report implements Printable {
@override
void printDetails() => print('Monthly Report');
}
class Receipt implements Printable {
@override
void printDetails() => print('Receipt for purchase');
}
void printAll(List<Printable> items) {
for (var item in items) {
item.printDetails();
}
}
void main() {
var documents = [Invoice(), Report(), Receipt()];
printAll(documents);
}Invoice, Report, dan Receipt adalah class yang sama sekali tidak berhubungan. Ketiganya tidak memiliki parent yang sama. Namun, karena semuanya mengimplementasikan Printable, kita dapat menyimpannya dalam list yang sama dan memanggil printDetails() pada setiap objek.
Ini sangat berguna karena memungkinkan kamu menentukan kontrak perilaku tanpa memaksakan hierarki pewarisan. Class apa pun dapat mengimplementasikan interface, terlepas dari apa yang diperluasnya. Kodemu menjadi lebih modular karena kamu dapat menambahkan tipe yang dapat dicetak tanpa mengubah kode yang sudah ada, cukup implementasikan interface.
Tantangan
MudahMari buat sistem pemutar media yang menunjukkan polimorfisme melalui interface. Kamu akan membuat interface yang mendefinisikan arti "playable", lalu mengimplementasikan beberapa tipe media yang tidak saling terkait dan semuanya memenuhi kontrak ini. Dengan begitu, semuanya dapat ditangani secara seragam meskipun tidak memiliki hubungan pewarisan.
Kamu akan mengatur kodemu ke dalam dua file:
media.dart: Definisikan interface dan class media di sini:- Sebuah abstract class
Playabledengan dua method abstrak:play()danString getMediaType() - Sebuah class
Songyang mengimplementasikanPlayable. Class ini harus memilikiString titledanString artist. Methodplay()mencetakPlaying song: [title] by [artist]dangetMediaType()mengembalikan'Audio' - Sebuah class
Videoyang mengimplementasikanPlayable. Class ini harus memilikiString titledanint duration(dalam menit). Methodplay()mencetakPlaying video: [title] ([duration] min)dangetMediaType()mengembalikan'Video' - Sebuah class
Podcastyang mengimplementasikanPlayable. Class ini harus memilikiString titledanint episode. Methodplay()mencetakPlaying podcast: [title] - Episode [episode]dangetMediaType()mengembalikan'Podcast'
playAll(List<Playable> playlist)yang melakukan iterasi melalui list dan mencetak[Media Type]:untuk setiap item, lalu memanggilplay()pada item tersebut.- Sebuah abstract class
main.dart: Impor file media-mu dan tunjukkan polimorfisme berbasis interface:- Buat
List<Playable>yang berisiSongdengan judul'Imagine'dan artis'John Lennon',Videodengan judul'Dart Tutorial'dan durasi15, sertaPodcastdengan judul'Tech Talk'dan episode42 - Berikan list ini ke
playAll()
- Buat
Perhatikan bahwa Song, Video, dan Podcast tidak memiliki class induk yang sama, semuanya merupakan tipe yang sama sekali tidak terkait. Namun, karena semuanya mengimplementasikan Playable, kamu dapat menyimpannya dalam list yang sama dan menanganinya secara seragam melalui interface.
Output yang diharapkan:
Audio:
Playing song: Imagine by John Lennon
Video:
Playing video: Dart Tutorial (15 min)
Podcast:
Playing podcast: Tech Talk - Episode 42Coba sendiri
import 'media.dart';
void main() {
// TODO: Buat List<Playable> yang berisi:
// - Song dengan judul 'Imagine' dan artis 'John Lennon'
// - Video dengan judul 'Dart Tutorial' dan durasi 15
// - Podcast dengan judul 'Tech Talk' dan episode 42
// TODO: Teruskan list ke playAll()
}
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