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.
Tantangan
MudahMari 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
Instrumentdengan propertyString namedan sebuah constructor. Sertakan methodplay()yang mencetak[name] makes a sound - Class
Guitaryang memperluasInstrumentdan menimpaplay()agar mencetak[name] strums melodically - Class
Drumyang memperluasInstrumentdan menimpaplay()agar mencetak[name] beats rhythmically - Class
Pianoyang memperluasInstrumentdan menimpaplay()agar mencetak[name] plays harmoniously
performConcert(List<Instrument> instruments)yang mencetakConcert begins!, lalu mengiterasi list sambil memanggilplay()pada setiap alat musik, dan terakhir mencetakConcert ends!- Class
main.dart: Impor file alat musikmu dan tunjukkan polimorfisme dengan membuat band campuran:- Buat list bertipe
List<Instrument>yang berisiGuitarbernama'Acoustic',Drumbernama'Snare', danPianobernama'Grand' - Berikan list ini kepada
performConcert()
- Buat list bertipe
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
}
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