1. Pengenalan Pewarisan
- Konsep dasar Pewarisan dalam Pemrograman Berorientasi Objek
Pewarisan adalah salah satu konsep fundamental dalam Pemrograman Berorientasi Objek
(PBO) yang memungkinkan untuk membuat hierarki kelas yang memungkinkan kelas
baru (subclass atau turunan) untuk mewarisi atribut dan metode dari kelas yang sudah ada
(superclass atau induk). Dalam analogi dunia nyata, pewarisan mirip dengan hubungan
antara induk dan anak. Subclass dapat mewarisi sifat-sifat dan perilaku dari superclass,
serta menambahkan atribut atau metode tambahan.
Dengan konsep dasar pewarisan dalam PBO, kita dapat membuat struktur kelas yang lebih
terorganisir dan membuat kode lebih efisien serta mudah diatur.
Contoh :
Misalakan kita memiliki kelas induk `Hewan` dengan metode `suara()`, dan du akelas
anak `Kucing` dan `Anjing` yang mewarisi dari `Hewan` dan mengoverride metode
metode `suara()` sesuai jenis hewan tersebut.
Dalam contoh ini, kelas `Kucing` dan kelas `Anjing` mewarisi metode `suara()` dari
kelas `Hewan`, tetapi mengoverride metode tersebut dengan implementasi yang sesuai
untuk jenis hewan masing-masing.
Dengan hubungan antara kelas induk (superclass) dan kelas anak (subclass), kita dapat
membuat hierarki kelas yang reflektif terhadap konsep dunia nyata dan memungkinkan
untuk pembagian kerja yang lebih terorganisir dalam kode.
Contoh:
Misalkan kita memiliki kelas induk `Kendaraan` dengan atribut `jumlah_roda` dan
metode `info()`, serta du akelas anak `Mobil` dan `Sepeda` yang mewarisi kelas
`Kendaraan`:
Dalam contoh ini:
- Kelas `Mobil` dan `Sepeda` mewarisi atribut `jumlah_roda` dan metode `info()`
dari kelas `Kendaraan`
- Subclass kemudian menambahkan atribut dan metode tambahan yang spesifik:
`merk` pada kelas `Mobil` dan `jenis` pada kelas `Sepeda`
Dengan car aini, pewarisan memungkinkan kita untuk membangun hierarki kelas yang
membagikan karakteristik yang sama antara berbagai jenis objek, sambal memungkinkan
kustomisasi spesifik dalam subclass.
3. Penggunaan Keyword `super`
- Menggunakan keyword `super` dalam Subclass
Keyword `super` digunakan dalam subclass untuk mengakses metode atau konstraktor
dari superclass. Ini sangat bermanfaat Ketika kita ingin menggunakan atau menganti
perilaku yang telah didefinisikan dalam superclass. Keyword `super` menghindari
duplikasi kode dan memastikan bahwa kita tetap dapat mengakses implementasi
superclass.
Cara penggunaan keyword `super` adalah sebagai berikut:
1. Dalam metode subclass, panggil metode superclass dengan menggunakan
`super().nama_metode`.
2. Jika diperlukan, teruskan argument yang diperlukan ke metode superclass.
Contoh:
Misalkan kita memiliki kelas induk `Hewan` dengan metode `suara()` yang
mengembalikan suara umum hewan, dan kedua kelas anak `Kucing` dan `Anjing` yang
mewarisi dari kelas `Hewan` dan mengoverride metode `suara()` sesuai jenis hewan
tersebut:
Dalam contoh ini, kita tidak menggunakan `super` karena tidak perlu mengakses metode
superclass. Namun, mari lihat contoh yang menggunakan `super`:
Contoh:
Misalkan kita memiliki kelas induk `Orang` dengan atribut `nama` dan kelas anak
`Mahasiswa` yang mewarisi dari kelas `Orang` serta menambahkan atribut `nim`:
Penggunaan `super` dalam konstruktor memastikan bahwa inisialisasi dari kelas induk
terjadi sebelum inisialisasi dari kelas anak. Ini penting agar seluruh hierarki objek
diinisialisasi dengan benar.
Ketika semuah metode diwarisi dari superclass, subclass memiliki opsi untuk mengubah
perilaku metode tersebut sesuai dengan spesifikasinya sendiri. Ini memungkinkan kita
untuk menyesuaikan atau memodifikasi perilaku metode tanpa mengubah implementasi
di seluruh hierarki kelas.
Contoh:
Misalkan kita memiliki kelas induk `Bentuk` dengan metode `hitung_luas()`, dan kita
memiliki kelas anak `Persegi` yang mewarisi dari kelas `Bentuk` dan ingin
mengoverride metode `hitung_luas()` untuk menghitung luas persegi:
Contoh:
Misalkan kita memiliki kelas induk `Hewan` dengan metode `suarakan()`, dan kita
memiliki anak `Kucing` yang ingin mengubah perilaku metode `suarakan()` agar
mengembalikan suara “Meow”:
Dalam contoh ini, metode `suarakan()` diubah perilakunya dalam kelas `Kucing`.
Ketika kita memanggil metode ini pada objek `kucing`, implementasi dari metode dalam
kelas `Kucing` yang dieksekusi, bukan implementasi dari kelas `Hewan`.
5. Pewarisan Berganda
- Mewarisi dari beberapa Superclass (Multiple Inheritance)
Dalam PBO, beberapa Bahasa pemrograman memungkinkan sebuah kelas untuk mewarisi
atribut dan metode dari lebih dari satu superclass. Ini dikenal sebagai multiple inheritance.
Situasi ini muncul Ketika kelas memiliki karakteristik yang bisa ditemukan dalam lebih
dari satu hierarki kelas. Dengan multiple inheritance, kelas anak dapat mewarisi sifat-sifat
dari beberapa superclass.
Contoh:
Misalkan kita memiliki kelas `Hewan` dan kelas `Alat` sebagai dua superclass yang
memiliki atribut dan metode spesifik. Kita juga memiliki kelas anak `Robot` yang ingin
memiliki atribut dan metode dari kedua kelas superclass tersebut:
Dalam contoh ini, kelas `Robot` mewarisi atribut dan metode dari kedua superclass, kelas
`Hewan` dan kelas `Alat`. Kita bisa melihat bagaimana kelas `Robot` memiliki akses
kepada atribut `bergerak()` dari kelas `Hewan` dan metode ‘gunakan()’ dari kelas
‘Alat’.
Namun, penting untuk diingit bahwa multiple inheritance bisa menjadi rumit dalam
beberapa kasus dan dapat menghasilkan masalah yang disebut “diamond problem”
(Ketika kelas anak mewarisi dari dua superclass yang memiliki hubungan hierarki ke kelas
induk yang sama). Beberapa Bahasa pemrograman memiliki mekanisme khusus untuk
mengatasi masalah ini, seperti penggunaan urutan resolusi metode (Method Resolution
Order) yang menentukan urutan pemanggilan metode saat terjadi multiple inheritance.
Pemahaman tentang kapan dan bagaiman menerapkan multiple inheritance sangat penting
untuk memastikan desain kelas yang baik dan menghindari masalah yang mungkin
muncul.
Contoh:
Misalnya, jika kelas anak `Manusia` mewarisi dari superclass `Orang` dan `Pekerja`,
dan kedua superclass tersebut memiliki metode `info()`, kitab isa menentukan akses
superclass dengan jelas:
Dalam contoh ini, kita menggunakan nama masing-masing kelas pada subclass untuk
secara eksplisit menentukan akses ke metode `info()` dari masing-masing superclass.
Pemahaman tentang potensi konflik dan cara menanganinya sangat penting dalam
multiple inheritance untuk memastikan desain yang konsisten dan menghindari masalah
saat penggunaan kelas-kelas dengan hierarki yang kompleks.
Dengan cara ini, konstruktor dalam pewarisan memungkinkan objek dari subclass untuk
diinisialisasi dengan baik, termasuk atribut yang diwarisi dari superclass. Konstruktor
superclass membantu memastikan bahwa atribut yang diperlukan oleh subclass telah
diinisialisasi dengan benar sebelum objek dibuat.
Contoh:
Misalkan kita memiliki kelas induk `Orang` dengan konstruktor yang menginisialisasi
atribut `nama`, dan kita memiliki kelas anak `Mahasiswa` yang mewarisi dari kelas
`Orang` serta menambahkan atribut `nim`. Kita ingin menggunakan konstruktor kelas
`Orang` dalam konstruktor kelas `Mahasiswa`:
Metode Abstrak:
Metode abstrak adalah metode yang dideklarasikan di dalam kelas abstrak tetapi tidak
memiliki implementasi konkret dalam kelas abstrak tersebut. Metode abstrak menunjukkan
bahwa setiap kelas turunan yang mewarisi dari kelas abstrak tersebut wajib
mengimplementasikan metode ini dengan implementasi yang sesuai.
Dalam contoh ini, kelas `Bentuk` adalah kelas abstrak yang memiliki metode abstrak
`hitung_luas()`. Kedua kelas turunan `Persegi` dan `Lingkaran`, wajib
mengimplementasikan metode ini. Hal ini memastikan bahwa setiap kelas turunan memiliki
metode `hitung_luas()` yang sesuai dengan konsep yang telah didefinisikan dalam kelas
abstrak.
Dengan menggunakan kelas abstrak dan metode abstrak, kita dapat membangun struktur kelas
yang lebih terstruktur dan memastikan implementasi yang sesuai di seluruh hierarki kelas.
Struktur kelas: