Menu
CoddyTech

Dasar-Dasar Polimorfisme

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 57 dari 110.

Polimorfisme berarti "banyak bentuk", yaitu kemampuan untuk menangani object dari class yang berbeda melalui antarmuka yang sama. Saat kamu memiliki referensi ke class induk, referensi itu dapat menunjuk ke object dari class anak mana pun, dan method yang tepat akan dipanggil berdasarkan tipe object yang sebenarnya.

Ini sangat berguna karena kamu bisa menulis kode yang bekerja dengan tipe induk, tetapi secara otomatis menangani semua tipe turunan dengan benar:

class Animal {
  void speak() => print('Some sound');
}

class Dog extends Animal {
  @override
  void speak() => print('Woof!');
}

class Cat extends Animal {
  @override
  void speak() => print('Meow!');
}

void main() {
  Animal myPet = Dog();  // Tipe induk, object turunan
  myPet.speak();  // output: Woof!
  
  myPet = Cat();  // Variabel yang sama, object berbeda
  myPet.speak();  // output: Meow!
}

Variabel myPet dideklarasikan sebagai Animal, tetapi nilainya berupa Dog atau Cat. Saat speak() dipanggil, Dart melihat tipe object yang sebenarnya saat program berjalan dan memanggil method override yang sesuai.

Ini memungkinkan kamu menulis fungsi fleksibel yang bekerja dengan subclass apa pun:

void makeAllSpeak(List<Animal> animals) {
  for (var animal in animals) {
    animal.speak();  // Setiap hewan bersuara dengan caranya sendiri
  }
}

void main() {
  var pets = [Dog(), Cat(), Dog()];
  makeAllSpeak(pets);
  // output: Woof! Meow! Woof!
}

Fungsi ini tidak perlu mengetahui Dog atau Cat, fungsi ini hanya bekerja dengan Animal. Ini membuat kodemu lebih mudah dikembangkan karena menambahkan tipe hewan baru tidak memerlukan perubahan pada fungsi yang sudah ada.

challenge icon

Tantangan

Mudah

Mari kita buat sistem alat musik yang menunjukkan polimorfisme secara langsung. Kamu akan membuat class dasar Instrument dan beberapa tipe alat musik, lalu menulis fungsi yang dapat membuat kumpulan alat musik apa pun bermain bersama, tanpa mengetahui tipe spesifiknya.

Kamu akan mengatur kodemu ke dalam dua file:

  • instruments.dart: Definisikan hierarki alat musikmu di sini:
    • Class Instrument dengan property String name dan sebuah constructor. Sertakan method play() yang mencetak [name] makes a sound
    • Class Guitar yang memperluas Instrument dan menimpa play() agar mencetak [name] strums melodically
    • Class Drum yang memperluas Instrument dan menimpa play() agar mencetak [name] beats rhythmically
    • Class Piano yang memperluas Instrument dan menimpa play() agar mencetak [name] plays harmoniously
    Buat juga fungsi performConcert(List<Instrument> instruments) yang mencetak Concert begins!, lalu mengiterasi list sambil memanggil play() pada setiap alat musik, dan terakhir mencetak Concert ends!
  • main.dart: Impor file alat musikmu dan tunjukkan polimorfisme dengan membuat band campuran:
    • Buat list bertipe List<Instrument> yang berisi Guitar bernama 'Acoustic', Drum bernama 'Snare', dan Piano bernama 'Grand'
    • Berikan list ini kepada performConcert()

Perhatikan bagaimana performConcert() bekerja dengan tipe induk Instrument, tetapi setiap alat musik bermain dengan caranya sendiri. Inilah polimorfisme, pemanggilan method yang sama menghasilkan perilaku berbeda berdasarkan tipe object sebenarnya.

Output yang diharapkan:

Concert begins!
Acoustic strums melodically
Snare beats rhythmically
Grand plays harmoniously
Concert ends!

Coba sendiri

import 'instruments.dart';

void main() {
  // TODO: Buat List<Instrument> yang berisi:
  // - Guitar bernama 'Acoustic'
  // - Drum bernama 'Snare'
  // - Piano bernama 'Grand'
  
  
  // TODO: Panggil performConcert() dengan list instrumenmu
  
}
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