oopinheritanceextendsMenengah5 mnt baca

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.

dart
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!
}
  • extends membuat class anak mewarisi semua milik induk
  • super(nama) memanggil constructor induk
  • @override menandai method yang ditulis ulang (isinya boleh beda)

Polymorphism: satu tipe, banyak wujud

Karena Kucing adalah Hewan, kita bisa memperlakukan semuanya sebagai Hewan:

dart
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:

dart
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

dart
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.