Anda di halaman 1dari 18

Inheritance (Pewarisan)

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.

- Manfaat Pewarisan dalam Pengembangan Perangkat Lunak


Pewarisan memiliki beberapa manfaat utama dalam pengembangan perangkat lunak:
1. Reusabilitas Kode: Pewarisan memungkinkan kita untuk menggunakan kembali
kode yang sudah ada dalam superclass. Ini menghemat waktu dan usaha dalam
pengembangan.
2. Pengelolaan Kode yang Lebih Baik: Pewarisan membantu mengorganisir kode
dengan membuat hierarki kelas. Hal ini memudahkan pemahaman dan pemeliharaan
kode.
3. Konsistensi: Jika terdapat sifat atau metode yang sama di beberapa kelas terkait,
pewarisan memastikan bahwa perubahan yang dibuat di superclass secara otomatis
berdampak pada semua subclass yang mewarisi.
4. Fleksibilitas dan Ekstensibilitas: Subclass dapat menambahkan perilaku atau atribut
tambahan sesuai kebutuhan tanpa memodifikasi superclass.
Contoh:
Misalnya kita memiliki kelas `Kendaraan` sebagai superclass dengan atribut
`jumlah_roda` dan metode `info()`. Kemudian kita memiliki subclass `Mobil` dan
`Sepeda` yang mewarisi dari `Kendaraan`. Kedua subclass ini dapat menambahkan atribut
dan metode tambahan sesuai dengan jenis kendaraannya.
Dalam contoh ini, kelas `Mobil` dan `Sepeda` mewarisi atribut dan metode dari
`Kendaraan`, dan masing-masing menambahkan atribut dan metode yang spesifik.

Dengan konsep dasar pewarisan dalam PBO, kita dapat membuat struktur kelas yang lebih
terorganisir dan membuat kode lebih efisien serta mudah diatur.

2. Superclass dan Subclass


- Hubungan antara kelas induk (superclass) dan kelas anak (subclass)
Dalam PBO, hubungan antara kelas induk (superclass) dan kelas anak (subclass) adalah
dasar dari konsep pewarisan. Subclass mewarisi atribut dan metode dari superclass, yang
memungkinkan kita untuk membagikan perilaku dan sifat yang sama antara berbagai
kelas. Berikut poin-poin penting tentang hubungan antara kelas induk (superclass) dan
kelas anak (subclass):
1. Pewarisan Atribut dan Metode: Ketika kelas anak mewarisi dari kelas induk, itu
berarti kelas anak menerima semua atribut dan metode yang telah didefinisikan dalam
kelas induk. Ini termasuk metode yang dapat diakses dan diubah oleh kelas anak.
2. Menambahkan Atribut dan Metode Tambahan: Selain mewarisi atribut dan
metode, kelas anak juga dapat menambahkan atribut dan metode tambahan sesuai
kebutuhan. Ini memungkinkan kita untuk mengkustomisasi perilaku kelas anak.
3. Overriding Metode: Subclass dapat mengganti (override) metode yang diwarisi dari
superclass dengan implementasi yang sesuai untuk subclass tersebut. Ini
memungkinkan perubahan perilaku metode dalam subclass.
4. Penggunaan Keyword `super`: Dalam metode subclass, kita dapat menggunakan
keyword `super` untuk mengakses metode dari superclass. Ini berguna Ketika kita
ingin memodifikasi metode yang sudah ada dalam superclass.
5. Hierarki Kelas: Dengan mewarisi dari satu atau lebih superclass, kita dapat membuat
hierarki kelas yang menggambarkan hubungan semantik antara berbagai jenis objek.

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.

- Mewarisi atribut dan metode dari superclass


Ketika sebuah subclass dibuat, itu dapat mewarisi atribut dan metode yang telah
didefinisikan dalam superclass. Ini memungkinkan subclass untuk memiliki sifat-sifat dan
perilaku yang sama dengan superclass, serta memungkinkan untuk menambahkan sifat
dan perilaku tambahan yang spesifik untuk subclass tersebut. Proses pewarisan
memudahkan penggunaan Kembali kode yang sudah ada dan membantu mengatur kode
dengan lebih baik. Berikut adalah cara subclass mewarisi atribut dan metode dari
superclass:
1. Atribut:
- Subclass akan memiliki semua atribut yang telah didefinisikan dalam superclass.
- Atribut-atribut ini dapat diakses dan digunakan dalam subclass dengan cara yang
sama seperti dalam superclass.
2. Metode:
- Subclass akan mewarisi semua metode yang telah didefinisikan dalam superclass.
- Metode-metode ini dapat digunakan dalam subclass dengan cara yang sama seperti
dalam superclass.

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

Dalam contoh kedua, `super().suara()` digunakan dalam metode `suara()` dari


kelas `Kucing` dan kelas `Anjing` untuk mengakses metode `suara()` dari kelas
`Hewan` dan menambahkan suara spesifik kelas anak dibelakangnya.

Penggunaan keyword `super` membantu menjaga konsistensi dan menghindari duplikasi


kode Ketika ingin mengakses atau mengganti perilaku yang telah didefinisikan dalam
superclass.

- Meneruskan argument konstruktor ke superclass menggunakan `super`


Ketika kita ingin membuat sebuah objek dari subclass dan ingin menginisialisasi atribut
dari superclass, kita dapat meneruskan argument konstruktor ke konstruktor superclass
menggunakan keyword `super`. Ini memungkinkan inisialisasi yang tepat pada kedua
kelas, sehingga objek subclass memiliki atribut dari kelas induk serta atribut tambahan
yang didefinisikan dalam subclass.
Berikut adalah cara untuk meneruskan argument konstruktor ke superclass menggunakan
`super`:
1. Dalam konstruktor subclass, gunakan `super().__init__(argumen)`.
2. Sertakan argument yang dibutuhkan oleh konstruktor superclass.

Contoh:

Misalkan kita memiliki kelas induk `Orang` dengan atribut `nama` dan kelas anak
`Mahasiswa` yang mewarisi dari kelas `Orang` serta menambahkan atribut `nim`:

Dalam contoh ini, pada konstruktor `Mahasiswa`, kita menggunakan


`super().__init__(nama)` untuk memanggil konstruktor `Orang` dan
menginisialisasi atribut `nama` dalam superclass. Selanjutnya, kita menambahkan atribut
`nim` untuk kelas `Mahasiswa`.

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.

Dengan meneruskan argument konstruktor ke superclass menggunakan `super`, kita


dapat mengatur inisialisasi yang lebih lengkap dan efisien pada kedua kelas, sehingga
menciptakan objek yang terintegrasi dengan baik dalam hierarki kelas.
4. Override Metode
- Definisi ulang (override) metode yang diwarisi dari superclass
Definisi ulang atau override metode adalah proses di mana sebuah subclass menyediakan
implementasi baru untuk metode yang sudah didefinisikan dalam superclass. Dengan kata
lain, subclass mengganti implementasi metode dari superclass dengan implementasi yang
lebih sesuai dengan kebutuhan kelas anak.

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:

Dalam contoh ini, kelas `Persegi` mengoverride metode `hitung_luas()` yang


diwarisi dari kelas `Bentuk`. Ketika kita memanggil metode `hitung_luas()` pada
objek `persegi`, implementasi dari metode dalam kelas `Persegi` yang akan
dieksekusi, bukan implementasi dari kelas `Bentuk`.
Dengan demikian, definisi ulang metode memungkinkan kita untuk memodifikasi
perilaku metode sesuai dengan kebutuhan spesifik kelas anak tanpa mengubah perilaku
metode di kelas induk atau kelas lain yang mungkin juga mewarisi metode tersebut.
- Mengubah perilaku metode dalam subclass
Dalam PBO, Ketika sebuah kelas anak (subclass) mewarisi metode dari kelas induk
(superclass), subclass memiliki opsi untuk mengubah perilaku metode tersebut. Proses ini
dikenal sebagai perubahan perilaku metode (method overriding). Dengan mengubah
perilaku metode, kita dapat memberikan implementasi yang lebih sesuai atai spesifik
untuk subclass.

Cara mengubah perilaku metode dalam subclass:


1. Definisikan ulang (override) metode dalam subclass dengan nama yang sama seperti
dalam superclass.
2. Tuliskan implementasi baru untuk metode tersebut di dalam subclass.

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

Pengubahan perilaku metode ini memungkinkan kita untuk memberikan karakteristik


yang lebih spesifik atau unik bagi setiap subclass dalam hierarki kelas. Hal ini penting
untuk menghasilkan perilaku yang lebih tepat sesuai dengan jenis objek yang diwakilkan
oleh masing-masing kelas dalam program.

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.

- Potensi konflik dan cara menanganinya


Ketika sebuah kelas anak mewarisi dari beberapa superclass yang memiliki metode atau
atribut dengan nama yang sama, potensi konflik dapat muncul. Ini dikenal sebagai “nama
ganda” atau “nama yang tumpeng tindih” (name clash). Masalah ini terutama muncul
Ketika sebuah metode atau atribut memiliki nama yang sama dalam beberapa superclass.

Cara menangani konflik:


Ada beberapa cara untuk menangani potensi konflik yang muncul dalam multiple
inheritance:
1. Menentukan Akses Superclass dengan Jelas: Ketika ada nama yang sama dalam
beberapa superclass, kitab isa secara eksplisit menentukan superclass mana yang ingin
kita akses menggunakan `super()`. Ini menghindari ambiguitas dalam pemanggilan
metode atau atribut.
2. Override Metode dengan Nama yang Sama: Jika metode dengan nama yang sama
ditemukan dalam beberapa superclass, kitab isa mengoverride metode tersebut dalam
kelas anak. Ini memungkinkan kita untuk memberikan implementasi yang sesuai
dengan kebutuhan kelas anak.
3. Alih-alih Pewarisan, Menggunakan Komposisi: Jika potensi konflik terlalu rumit,
kita dapat memilih untuk tidak menerapkan multiple inheritance secara langsung.
Alih-alih itu, kitab isa menggunakan komposisi, yaitu membuat objek dari kelas-kelas
yang dibutuhkan sebagai atribut dalam kelas anak.
4. Gunakan MRO (Methode Resolution Order): Beberapa Bahasa pemrograman,
seperti Python, memiliki aturan penentuan urutan pemangilan metode (MRO) yang
membantu menentukan urutan pemanggilan metode dalam multiple inheritance. Ini
menghindari ambigu dan konflik.
5. Gunakan Alias: Jika nama yang tumpeng tindi tidak dapat dihindari, kitab isa
memberikan alias pada metode atau atribut yang mewarisi dari superclass. Alias ini
memungkinkan kita untuk membedakan antara implementasi yang berbeda dalam
kelas anak.

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.

6. Konstruktor dalam Pewarisan


- Cara Kerja Kontruktor dalam Pewarisan:
Konstruktor adalah metode khusus dalam sebuah kelas yang dipanggil saat objek dari
kelas tersebut dibuat. Dalam pewarisan, konstruktor dapat memiliki interaksi yang
menarik antara superclass dan subclass. Ketika objek dari subclass dibuat, konstruktor
subclass akan memanggil konstruktor superclass untuk menginisialisasi atribut yang
diwarisi dari superclass.

Berikut cara kerja konstruktor dalam pewarisan:


1. Penggilan Konstruktor Superclass: Saat konstruktor subclass dipanggil, biasanya
konstruktor superclass juga akan dipanggil terlebih dahulu menggunakan
`super().__init__()`. Hal ini memungkinkan inisialisasi atribut yang diwarisi dari
superclass.
2. Inisialisasi Atribut Subclass: Setelah konstruktor superclass selesai dieksekusi,
konstruktor subclass dapat dilanjutkan dengan menginisialisasi atribut yang spesifik
untuk subclass.

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.

- Menggunakan konstruktor superclass dalam konstruktor subclass


Ketika kita ingin menginisialisasi objek dari subclass dan juga ingin melakukan
inisialisasi atribut yang diwarisi dari superclass, kitab isa menggunakan konstruktor
superclass dalam konstruktor subclass. Hal ini memastikan bahwa inisialisasi superclass
terjadi sebelum inisialisasi subclass, sehingga objek terbuat dengan benar dan konsisten.
Cara menggunakan konstruktor superclass dalam konstruktor subclass:
1. Panggil konstruktor superclass menggunakan `super().__init__()` dalam
konstruktor subclass.
2. Sertakan argument yang diperlukan oleh konstruktor superclass.

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

Dalam contoh ini, konstruktor kelas `Mahasiswa` menggunakan


`super().__init__(nama)` untuk memanggil konstruktor kelas `Orang` dan
menginisialisasi atribut `nama` yang diwarisi dari kelas `Orang`. Setelah itu, konstruktor
kelas `Mahasiswa` melanjutkan dengan menginisialisasi atribut `nim` yang spesifik
untuk kelas `Mahasiswa`.
Dengan menggunakan konstruktor superclass dalam konstruktor subclass, kita dapat
memastikan bahwa semua atribut yang diperlukan dalam hierarki kelas terinisialisasi
dengan benar sebelum objek dibuat. Ini membantu dalam menciptakan objek yang
terintegrasi dengan baik dan sesuai dengan hierarki kelas yang telah didefinisikan.

7. Kelas Abstrak dan Metode Abstrak


Kelas Abstrak:
Kelas abstrak adalah kelas yang tidak dapat diinstansiasi secara langsung, tetapi dirancang
untuk menjadi kerangka dasar bagi kelas-kelas turunanya. Kelas abstrak sering
menggambarkan konsep umum atau fitur yang ingin diwariskan oleh kelas-kelas turunannya.
Salah satu ciri penting dari kelas abstrak adalah bahwa kelas tersebut dapat memiliki metode
abstrak.

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.

Tujuan Kelas Abstrak dan Metode Abstrak:


1. Mendefinisikan Kerangka Dasar: Kelas abstrak membantu dalam mendefinisikan
kerangka dasar yang diikuti oleh kelas-kelas turunanya. Ini membantu dalam mengatur
struktur dan hubungan antara berbagai kelas.
2. Memaksa Implementasi: Metode abstrak memaksa kelas-kelas turunan untuk
mengimplementasikan metode tersebut. Ini membantu dalam memastikan bahwa perilaku
yang sesuai dan spesifik ada dalam setiap kelas turunan.
Contoh:

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.

8. Contoh Penggunaan Pewarisan


- Contoh studi kasus konkret penggunaan pewarisan dalam pengembangan perangkat lunak

Studi Kasus : Sistem Manajemen Perpustakaan


Deskripsi : Dalam pengembangan perangkat lunak sistem manajemen perpustakaan,
sistem ini dibuat yang akan memiliki berbagai jenis pengguna seperti : anggota
perpustakaan, petugas, dan administrator. Kita akan menggunakan pewarisan untuk
mengorganisir hubungan antara pengguna-pengguna tersebut.

Struktur kelas:

1. Kelas Induk: Pengguna


Atribut: `nama`, `umur`
Metode: `cetak_info()`
2. Kelas Anak 1: AnggotaPerpustakaan(mewarisi dari Pengguna)
Atribut Tambahan: `nomor_anggota`, `jumlah_pinjaman`
Metode Tambahan: `pinjam_buku()`, `kembalikan_buku()`
3. Kelas Anak 2: Petugas(Mewarisi dari Pengguna)
Atribut Tambahan: `nomor_petugas`, `bagian_tugas`
Metode Tambahan: `input_buku_baru()`, `cetak_laporan()`
4. Kelas Anak 3: Administrator(Mewarisi dari Pengguna)
Atribut Tambahan: `nomor_admin`, `hak_akses`
Metode Tambahan: `tambah_pengguna()`, `hapus_pengguna()`

Anda mungkin juga menyukai