dart oop inheritance encapsulation polymorphism | java php laravel linux mysql sql bootstrap html css query java php laravel linux mysql sql bootstrap html css query: dart oop inheritance encapsulation polymorphism

Sunday, May 3, 2026

dart oop inheritance encapsulation polymorphism

🎯 OOP Lanjutan   Artikel 7 dari 16

OOP Bagian 2
Inheritance, Encapsulation
& Polymorphism

Kuasai tiga pilar OOP yang bikin kode Dart kamu lebih rapi, reusable, dan profesional — dengan analogi dunia nyata yang mudah dipahami.

⏱️
Estimasi Baca
12 Menit
📶
Level
Menengah
📅
Tahun
2026
🎓
Seri
Dart From Zero to Zorro

Pernah nggak kamu nulis kode yang sama berulang kali, dan dalam hati bilang "ini pasti ada cara yang lebih elegan"? Nah, itu tandanya kamu udah siap belajar inheritance, encapsulation, dan polymorphism — tiga senjata rahasia OOP di Dart yang akan mengubah cara kamu menulis kode selamanya. Kalau di artikel sebelumnya kita udah kenalan sama Class dan Object, sekarang kita naik level: kita bahas inheritance polymorphism Dart yang jadi pondasi aplikasi Flutter skala besar. Artikel ini dibuat untuk kamu yang udah paham Class dasar dan siap melangkah lebih jauh. Siap? Kita mulai! 🚀

🧬 Inheritance di Dart — Mewarisi Supaya Tidak Mengulang

Inheritance (pewarisan) adalah mekanisme di mana sebuah class bisa "mewarisi" properti dan method dari class lain. Bayangkan kamu punya resep masakan keluarga turun-temurun — anak bisa memakai resep dasar orang tua, lalu menambah bumbu sendiri tanpa harus menulis ulang seluruh resep dari nol.

Dalam Dart, class yang mewarisi disebut subclass (child class), dan class yang diwarisi disebut superclass (parent class). Kata kunci yang digunakan adalah extends.

📐 Formula Inheritance
class SubClass extends SuperClass { ... }
SubClass mewarisi semua properti & method non-private dari SuperClass.
📋 Langkah-Langkah Membuat Inheritance di Dart
1
Buat Superclass (Parent)
Definisikan class dasar dengan properti dan method yang akan diwarisi. Ini adalah "template umum".
2
Buat Subclass dengan extends
Gunakan kata kunci extends untuk mewarisi. Subclass otomatis punya semua yang dimiliki superclass.
3
Gunakan super untuk akses Parent
Kata kunci super digunakan untuk memanggil constructor atau method milik superclass.
4
Override Method jika Perlu
Subclass bisa menimpa (override) method dari superclass menggunakan anotasi @override.
inheritance_dart.dart
class Hewan {
  String nama;
  int umur;

  Hewan(this.nama, this.umur);

  void bernapas() {
    print('$nama sedang bernapas...');
  }
}

// 🐕 Anjing mewarisi Hewan
class Anjing extends Hewan {
  String ras;

  Anjing(String nama, int umur, this.ras)
      : super(nama, umur); // panggil constructor parent

  void menggonggong() {
    print('$nama ($ras): Woof! Woof!');
  }
}

void main() {
  var doggo = Anjing('Max', 3, 'Golden Retriever');
  doggo.bernapas();     // ✅ diwarisi dari Hewan
  doggo.menggonggong(); // ✅ milik Anjing sendiri
}

// Output:
// Max sedang bernapas...
// Max (Golden Retriever): Woof! Woof!
💡 Tips — Kapan Pakai Inheritance?
Gunakan inheritance kalau hubungan antara dua class bisa diungkapkan dengan kalimat "A adalah B". Contoh: Anjing adalah Hewan ✅. Tapi kalau relasinya lebih seperti "A memiliki B", gunakan composition, bukan inheritance.

🔐 Encapsulation — Lindungi Data, Kontrol Akses

Encapsulation adalah konsep menyembunyikan detail internal class dari dunia luar, dan hanya mengekspos apa yang perlu diekspos. Analoginya seperti mesin ATM — kamu bisa tarik uang, cek saldo, transfer — tapi kamu nggak bisa (dan nggak perlu) tahu gimana mesin ATM memproses semua itu di dalamnya.

Di Dart, encapsulation diterapkan dengan menambahkan underscore (_) di depan nama properti atau method untuk membuatnya menjadi private — hanya bisa diakses dari dalam file yang sama. Akses dari luar dikontrol lewat getter dan setter.

🔥 Fakta Menarik
Di Dart, private itu per-file (library), bukan per-class! Berbeda dengan Java atau C# yang private-nya per-class. Jadi kalau dua class ada dalam satu file .dart yang sama, mereka bisa akses properti private satu sama lain.
encapsulation_dart.dart
class RekeningBank {
  String pemilik;
  double _saldo; // 🔒 private!

  RekeningBank(this.pemilik, this._saldo);

  // Getter — hanya baca
  double get saldo => _saldo;

  // Method terkontrol untuk ubah saldo
  void deposit(double jumlah) {
    if (jumlah > 0) {
      _saldo += jumlah;
      print('Deposit Rp${jumlah} berhasil. Saldo: Rp${_saldo}');
    } else {
      print('❌ Jumlah deposit harus positif!');
    }
  }

  void tarik(double jumlah) {
    if (jumlah <= _saldo) {
      _saldo -= jumlah;
      print('Tarik Rp${jumlah} berhasil. Sisa: Rp${_saldo}');
    } else {
      print('❌ Saldo tidak cukup!');
    }
  }
}

void main() {
  var rekening = RekeningBank('Budi', 500000);
  print(rekening.saldo);         // ✅ OK via getter
  // rekening._saldo = 999999; // ❌ Error! Private
  rekening.deposit(200000);
  rekening.tarik(800000);       // ❌ Saldo tidak cukup
}
⚠️ Perhatian
Jangan langsung buat semua properti private hanya karena terdengar "lebih aman". Terlalu banyak getter/setter justru membuat kode verbose. Pertimbangkan mana data yang benar-benar perlu dilindungi dari modifikasi langsung.

🎭 Polymorphism — Satu Interface, Banyak Bentuk

Polymorphism berasal dari bahasa Yunani: poly (banyak) + morphe (bentuk). Dalam dunia inheritance polymorphism Dart, konsep ini berarti satu method yang sama bisa berperilaku berbeda tergantung object yang menggunakannya.

Analogi: tombol "play" di YouTube dan Spotify melakukan hal yang berbeda, tapi keduanya tetap dinamakan tombol "play". Inilah inti dari polymorphism — antarmuka yang sama, implementasi yang berbeda.

Di Dart, polymorphism dicapai melalui method overriding (menimpa method dari superclass) dan interface/abstract class.

polymorphism_dart.dart
// Abstract class = kontrak yang harus dipenuhi
abstract class Bentuk {
  double hitungLuas(); // wajib diimplementasi
  void info() {
    print('Luas: ${hitungLuas()}');
  }
}

class Lingkaran extends Bentuk {
  double radius;
  Lingkaran(this.radius);

  @override
  double hitungLuas() => 3.14 * radius * radius;
}

class Persegi extends Bentuk {
  double sisi;
  Persegi(this.sisi);

  @override
  double hitungLuas() => sisi * sisi;
}

void main() {
  // 🎭 Polymorphism: satu tipe, banyak bentuk
  List<Bentuk> daftarBentuk = [
    Lingkaran(7),
    Persegi(5),
    Lingkaran(3),
  ];

  for (var b in daftarBentuk) {
    b.info(); // method yang SAMA, hasil BEDA!
  }
}
// Output:
// Luas: 153.86
// Luas: 25.0
// Luas: 28.26
⚡ Insight Penting
Polymorphism membuat kode kamu sangat extensible. Mau tambah bentuk baru seperti Segitiga atau Trapesium? Cukup buat class baru yang extends Bentuk, dan loop di main() nggak perlu diubah sama sekali. Ini yang disebut Open/Closed Principle — terbuka untuk ekstensi, tertutup untuk modifikasi.

📊 Perbandingan: Inheritance vs Encapsulation vs Polymorphism

🔍 Analisis Mendalam — Kapan Menggunakan Masing-masing?
Konsep Tujuan Utama Kata Kunci Dart Analogi
Inheritance Reuse kode dari parent class extends, super 📜 Resep turun-temurun
Encapsulation Lindungi data internal _nama, get, set 🏧 Mesin ATM
Polymorphism Satu interface, banyak perilaku @override, abstract ▶️ Tombol Play
Gabungan ketiganya Arsitektur kode yang scalable semua di atas 🏢 Sistem perbankan

🚀 Studi Kasus — Gabungkan Ketiganya dalam Proyek Nyata

Sekarang saatnya kita gabungkan inheritance polymorphism Dart bersama encapsulation dalam satu contoh yang realistis: sistem pembayaran sederhana. Ini persis pola yang akan kamu temui saat membangun aplikasi Flutter sungguhan.

payment_system.dart
// 🎭 Abstract Class — Polymorphism
abstract class MetodePembayaran {
  String _namaPenyedia; // 🔒 Encapsulation
  double _saldo;

  MetodePembayaran(this._namaPenyedia, this._saldo);

  String get namaPenyedia => _namaPenyedia;
  double get saldo => _saldo;

  void bayar(double jumlah); // wajib diimplementasi

  bool cukupSaldo(double jumlah) => _saldo >= jumlah;
}

// 🧬 Inheritance + Polymorphism
class GoPay extends MetodePembayaran {
  GoPay(double saldo) : super('GoPay', saldo);

  @override
  void bayar(double jumlah) {
    if (cukupSaldo(jumlah)) {
      _saldo -= jumlah;
      print('✅ [GoPay] Bayar Rp$jumlah. Sisa: Rp$_saldo');
    } else {
      print('❌ [GoPay] Saldo tidak cukup!');
    }
  }
}

class OVO extends MetodePembayaran {
  int _poinOvo; // fitur tambahan OVO

  OVO(double saldo) : _poinOvo = 0, super('OVO', saldo);

  @override
  void bayar(double jumlah) {
    if (cukupSaldo(jumlah)) {
      _saldo -= jumlah;
      _poinOvo += (jumlah * 0.01).toInt();
      print('✅ [OVO] Bayar Rp$jumlah. Poin: $_poinOvo');
    } else {
      print('❌ [OVO] Saldo tidak cukup!');
    }
  }
}

void main() {
  List<MetodePembayaran> dompet = [
    GoPay(150000),
    OVO(200000),
  ];

  for (var m in dompet) {
    print('Dompet: ${m.namaPenyedia}');
    m.bayar(50000); // Polymorphism!
  }
}
⚡ Insight — Pola ini Ada di Flutter!
Di Flutter, kamu akan sering melihat pola ini. Widget adalah abstract class, dan semua widget seperti Text, Container, Row adalah subclass-nya. Method build() adalah contoh polymorphism yang kamu override setiap hari!

🎯 Kesimpulan

Di artikel ke-7 seri Dart From Zero to Zorro ini, kita sudah menyelami tiga pilar OOP yang krusial:

  • Inheritance — mewarisi properti & method dengan extends, menghemat kode duplikat
  • Encapsulation — melindungi data internal dengan underscore (_), getter, dan setter
  • Polymorphism — satu interface, banyak implementasi via @override dan abstract class

Menguasai inheritance polymorphism Dart bukan sekadar hafalan teori — ini adalah pola pikir yang akan mengubah cara kamu merancang solusi. Setiap kali kamu membuka proyek Flutter, kamu akan melihat ketiga konsep ini bekerja bersama-sama di balik layar.

💬 Punya pertanyaan atau bingung di bagian mana? Tulis di kolom komentar! Dan kalau artikel ini bermanfaat, share ke teman-teman yang lagi belajar Dart — siapa tahu jadi pahala ilmu! 🙏
#BelajarDart #DartFromZeroToZorro #OOPDart #Inheritance #Polymorphism #Encapsulation #Flutter #ProgrammingIndonesia
📚
Bagian dari Seri 16 Artikel
Dart From Zero to Zorro

Artikel ini adalah bagian ke-7 dari seri lengkap belajar Dart dari nol hingga mahir. Mulai dari sintaks dasar sampai membangun aplikasi Flutter, semua ada di sini!

🗺️ Lihat Daftar Isi Lengkap →
🧭 Navigasi Artikel
← Artikel Sebelumnya
Artikel 6
OOP Bagian 1 — Class, Object, dan Constructor di Dart
← Baca Artikel Ini
Artikel Selanjutnya →
Artikel 8
Exception Handling — Tangani Error Biar Aplikasi Nggak Crash
Baca Artikel Ini →

No comments:

Post a Comment

saifiahmada.com adalah blog belajar programming Indonesia, membahas lengkap materi bahasa pemrograman: code HTML, CSS, Bootstrap, Desain, PHP, MySQL, coding Java, Query, SQL, dan dunia linux