Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 Playable dengan dua method abstrak: play() dan String getMediaType()
    • Sebuah class Song yang mengimplementasikan Playable. Class ini harus memiliki String title dan String artist. Method play() mencetak Playing song: [title] by [artist] dan getMediaType() mengembalikan 'Audio'
    • Sebuah class Video yang mengimplementasikan Playable. Class ini harus memiliki String title dan int duration (dalam menit). Method play() mencetak Playing video: [title] ([duration] min) dan getMediaType() mengembalikan 'Video'
    • Sebuah class Podcast yang mengimplementasikan Playable. Class ini harus memiliki String title dan int episode. Method play() mencetak Playing podcast: [title] - Episode [episode] dan getMediaType() mengembalikan 'Podcast'
    Buat juga fungsi playAll(List<Playable> playlist) yang melakukan iterasi melalui list dan mencetak [Media Type]: untuk setiap item, lalu memanggil play() pada item tersebut.
  • main.dart: Impor file media-mu dan tunjukkan polimorfisme berbasis interface:
    • Buat List<Playable> yang berisi Song dengan judul 'Imagine' dan artis 'John Lennon', Video dengan judul 'Dart Tutorial' dan durasi 15, serta Podcast dengan judul 'Tech Talk' dan episode 42
    • Berikan list ini ke playAll()

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 42

Coba 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()
}
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