Inheritance adalah konsep menurunkan sifat (propery dan method) ke dalam class lain. Inheritance digunakan untuk menghindari penulisan kode yang berulang-ulang. Class yang akan "diturunkan" disebut sebagai parent / super / base class, sedangkan class menerima penurunan disebut child / sub / derived class. Oh ya, konsep inheritance ini tidak hanya sebatas satu tingkatan saja, tapi bisa sesuka hati.

Mengingat lagi materi tentang class dan objek, tidak semua sifat dapat diturunkan. Namun, hanya bagian yang memiliki access specifier public atau protected.


Pembuatan

Pembuatan parent class tidak ada bedanya dengan pembuatan class biasa.

Perbedannya terletak di dalam child class. Proses menurunkan sifat ini di dalam konsep pemrograman dinamakan extends. Di dalam child class, kita dapat menambahkan property ataupun method baru yang tidak dimiliki parent.

Kemudian untuk membuktikan konsep inheritance, perhatikan kode berikut :

Class Fish tidak memiliki method Speak(), namun karena ia menuruni sifat dari Animal, kemampuan (method) Speak() turut diturunkan kepada Fish.

Eh iya lupa,
perlu dicatat bahwa child class harus lebih spesifik daripada parent. Dalam contoh di atas, class Dog dan Fish lebih spesifik dari class Animal.

Khusus untuk constructor, jika parent class hanya memiliki satu constructor dan constructor itu non-default, kita perlu juga membuat constructor yang sama.


Overloading

Overloading adalah dua atau lebih method yang memiliki nama yang sama, namun dengan jumlah parameter yang berbeda.

Dalam contoh di atas, kita melakukan overloading constructor Animal. Mana yang akan dieksekusi? Tergantung. Jika parameter inisialisasi hanya nama, maka yang pertama. Jika parameter inisialisasi ada tiga, maka yang kedua.


Overriding

Overriding adalah proses mendefiinisikan kembali sebuah method. Pendefinisian constructor class Fish di atas sebenarnya juga termasuk overriding, namun secara eksplisit. Kenapa? Karena kita dapat memberikan kode tambahan di dalamnya, alih-alih hanya mengeset property nama milik Animal.

Virtual

Sebelum melakukan override, method parent harus diberikan tanda pengenal bernama virtual.

Dengan pendefinisian virtual, pada dasarnya kita memberitahu bahwa karena child class selalu lebih spesifik dari parent, begitu pula method di dalamnya. Abaikan jika masih bisa dipakai. Tapi jika kurang, tambahi sendiri. Contohnya seperti berikut :

Pada gambar di atas, kita membuat anjing menyapa "hello". Kemudian memanggil base.Speak(). Apa fungsinya? Fungsinya agar method milik parent (base)* melanjutkannya. Maksudnya begini :

Method Speak() milik class Dog tidak melakukan debug "I'am an animal". Kode tentang itu ada di dalam class Animal.

Penggunaan base pada saat override tidaklah wajib. Kalau memang tidak ada yang sama ya tidak usah. Tapi mungkin lebih tepat kalau dibuat sebagai new atau abstract (tidak akan dijelaskan di sini).

New

Berbeda dengan override yang berfungsi men-extends method milik parent class, pendefinisian new akan membuat method yang benar benar lain.

Perhatikan kode berikut :

Deklarasi new sebenarnya tidak memanggil base. Tapi coba saja kita lihat hasilnya.

  • Instansiasi class Fish pada variabel golden bertipe data Fish
  • Instansiasi class Fish pada variabel golden bertipe data Animal

Hasilnya :
Pada inisialisasi pertama, method Speak() milik Fish tidak meneruskan ke Animal, walaupun di sana jelas-jelas memanggil base.Speak().

Sebaliknya pada inisialisasi kedua, walaupun bertipe data Animal tapi method Speak() yang dipanggil adalah milik Fish, karena di sana melakukan inisialisasi objek Fish, bukan Animal. Konsep di atas dinamakan dengan polymorphism (polimorfisme).


Materi Terkait