Inheritance dan Polymorphism
Mewarisi sifat class lewat extends, override method, dan memahami polymorphism.
Mewarisi tanpa menulis ulang
Bayangkan bikin aplikasi dengan class Kucing, Anjing, Burung. Semuanya punya nama dan bisa bersuara, cuma suaranya beda. Tanpa inheritance, kamu tulis property nama tiga kali. Dengan inheritance, tulis sekali di class induk.
class Hewan {
String nama;
Hewan(this.nama);
void bersuara() {
print('$nama bersuara...');
}
}
class Kucing extends Hewan {
Kucing(String nama) : super(nama); // teruskan ke constructor induk
@override
void bersuara() {
print('$nama: Meong!');
}
}
class Anjing extends Hewan {
Anjing(String nama) : super(nama);
@override
void bersuara() {
print('$nama: Guk guk!');
}
}
void main() {
var k = Kucing('Mochi');
var a = Anjing('Bruno');
k.bersuara(); // Mochi: Meong!
a.bersuara(); // Bruno: Guk guk!
}extendsmembuat class anak mewarisi semua milik induksuper(nama)memanggil constructor induk@overridemenandai method yang ditulis ulang (isinya boleh beda)
Polymorphism: satu tipe, banyak wujud
Karena Kucing adalah Hewan, kita bisa memperlakukan semuanya sebagai Hewan:
void main() {
List<Hewan> kebun = [Kucing('Mochi'), Anjing('Bruno')];
for (var h in kebun) {
h.bersuara(); // otomatis panggil versi yang benar!
}
}Walau tipenya Hewan, Dart memanggil bersuara() versi Kucing untuk Mochi dan versi Anjing untuk Bruno. Ini polymorphism: method yang sama, perilaku menyesuaikan object aslinya. Fondasi ini dipakai di Flutter saat list berisi berbagai jenis widget.
super: akses versi induk
Kadang override butuh tetap menjalankan logika induk:
class Pegawai {
String nama;
Pegawai(this.nama);
double gaji() => 5000000;
}
class Manager extends Pegawai {
Manager(String nama) : super(nama);
@override
double gaji() => super.gaji() + 3000000; // tambah tunjangan
}
void main() {
var m = Manager('Bu Rina');
print(m.gaji()); // 8000000.0
}super.gaji() memanggil versi induk, lalu hasilnya ditambah tunjangan.
Catatan teknis: Dart hanya mendukung single inheritance: satu class cuma bisa extends satu induk. Kalau butuh "mewarisi" dari banyak sumber, pakai mixin (modul berikutnya). Batasan ini disengaja untuk menghindari masalah diamond inheritance yang bikin pusing di bahasa seperti C++.
is dan as: cek dan cast tipe
void main() {
Hewan h = Kucing('Mochi');
print(h is Kucing); // true
print(h is Anjing); // false
if (h is Kucing) {
// di dalam blok ini, h otomatis dianggap Kucing
print('Ini kucing bernama ${h.nama}');
}
}Operator is mengecek tipe. Di dalam blok if (h is Kucing), Dart otomatis mempromosikan tipe h jadi Kucing (smart cast), jadi tidak perlu cast manual.
Kapan pakai inheritance?
Pakai saat ada hubungan "adalah" yang jelas: Kucing adalah Hewan, Manager adalah Pegawai. Kalau hubungannya "punya" (Mobil punya Mesin), jangan pakai inheritance, tapi jadikan Mesin sebagai property di dalam class Mobil (komposisi). Salah pakai inheritance bikin hierarki class jadi kaku dan susah diubah.