"Halo, Amigo! Sekarang, inilah topik yang menurut saya akan banyak Anda gunakan. Saya berbicara tentang warisan. "

Bagi yang belum tahu, pemrograman itu seperti sulap. Jadi izinkan saya memulai dengan sebuah analogi…

Misalkan Anda adalah seorang pesulap yang ingin membuat kuda terbang. Anda bisa mencoba menyulap Pegasus. Tetapi karena kuda terbang tidak muncul secara alami, Anda akan mengalami kesulitan. Anda akan memiliki banyak pekerjaan yang harus dilakukan. Akan jauh lebih mudah untuk memulai dengan seekor kuda dan memanggil beberapa sayap.

Warisan.  Keuntungan warisan - 1

Dalam pemrograman, kami menyebut proses ini «warisan» . Misalkan Anda perlu menulis kelas yang sangat kompleks. Anda bisa menghabiskan waktu lama untuk menulis kode dari awal, lalu melakukan pengujian panjang untuk menemukan bug. Tetapi mengapa melakukannya dengan cara yang sulit? Lebih baik melihat-lihat dan melihat apakah kelas yang Anda cari sudah ada?

Katakanlah Anda menemukan kelas yang mengimplementasikan 80% dari fungsionalitas yang Anda butuhkan. Anda cukup menyalin kodenya ke kelas Anda. Tapi itu akan memiliki beberapa kelemahan:

1) Kelas yang Anda temukan mungkin sudah dikompilasi menjadi bytecode. Anda mungkin tidak memiliki akses ke kode sumbernya.

2) Anda mungkin memiliki kode sumber untuk kelas tersebut, tetapi juga bekerja di perusahaan yang dapat dituntut beberapa miliar jika Anda menggunakan bahkan 6 baris kode orang lain. Dan kemudian mereka akan menuntut Anda.

3) Ini mengarah pada duplikasi banyak kode yang tidak perlu. Dan jika pembuat kelas lain menemukan bug dan memperbaikinya, Anda masih memiliki bug tersebut.

Ada solusi yang lebih elegan yang tidak memerlukan izin legal untuk kode kelas asli. Di Java, Anda cukup mendeklarasikan kelas lain sebagai induk dari kelas Anda. Ini sama dengan menambahkan kode kelas itu ke kelas Anda sendiri. Semua data dan metode kelas induk akan muncul di kelas Anda. Misalnya, Anda dapat mewarisi dari «kuda», menambahkan «sayap», dan mendapatkan «Pegasus».

Warisan.  Keuntungan warisan - 2

"Sangat menarik. Silakan lanjutkan."

"Warisan juga memiliki kegunaan lain. Misalkan Anda memiliki sepuluh kelas yang sangat mirip. Mereka memiliki data dan metode yang cocok. Anda dapat membuat kelas dasar khusus , memindahkan data (dan metode terkait) ke kelas dasar , dan memiliki sepuluh kelas tersebut mewarisi dari itu. Dengan kata lain, untuk setiap kelas, Anda menunjukkan bahwa ia memiliki kelas induk, juga dikenal sebagai kelas dasar."

"Sama seperti keuntungan dari abstraksi hanya benar-benar terungkap dalam kaitannya dengan enkapsulasi, keuntungan dari warisan diperbesar oleh polimorfisme. Tapi saya akan memberitahu Anda tentang itu besok. Hari ini mari kita lihat beberapa contoh warisan."

"Misalkan kita sedang menulis program catur. Kita memerlukan kelas untuk bidak catur. Kelas mana yang akan Anda sarankan, Amigo?"

"Raja, Ratu, Uskup, Ksatria, Benteng, dan Pion."

"Bagus sekali. Kau tidak melewatkan apa pun."

"Dan data apa yang akan Anda sarankan untuk disimpan di kelas-kelas ini?"

"Posisi papan masing-masing bidak (x dan y) dan nilainya. Lagi pula, beberapa bidak lebih berharga daripada yang lain."

"Dan apa perbedaan antara kelas-kelas ini?"

"Mereka berbeda dalam cara mereka memindahkan bidak. Dalam perilaku mereka."

"Ya. Anda bisa mendefinisikannya sebagai kelas seperti ini:"

class King
{
int x;
int y;
int worth;
void kingMove()
{
//code that defines,
//how the king moves
}
}
class Queen
{
int x;
int y;
int worth;
void queenMove()
{
//code that defines,
//how the queen moves
}
}
class Rook
{
int x;
int y;
int worth;
void rookMove()
{
//code that defines,
//how the rook moves
}
}
class Knight
{
int x;
int y;
int worth;
void knightMove()
{
//code that defines,
//how the knight moves
}
}
class Bishop
{
int x;
int y;
int worth;
void bishopMove()
{
//code that defines,
//how the bishop moves
}
}
class Pawn
{
int x;
int y;
int worth;
void pawnMove()
{
//code that defines,
//how the pawn moves
}
}

"Ya, persis seperti itulah aku akan menulisnya."

"Tapi lihat bagaimana Anda bisa menggunakan warisan untuk menulis lebih sedikit kode. Kita bisa memindahkan metode dan data yang identik ke dalam kelas umum. Sebut saja ChessItem. Tidak masuk akal untuk membuat objek ChessItem, karena mereka tidak sesuai dengan apa pun bidak catur. Tapi kelas akan sangat membantu:"

class King extends ChessItem
{
void kingMove()
{
//code that defines,
//how the king moves
}
}
class Queen extends ChessItem
{
void queenMove()
{
//code that defines,
//how the queen moves
}
}
class Rook extends ChessItem
{
void rookMove()
{
//code that defines,
//how the rook moves
}
}
 class ChessItem
{
int x;
int y;
int worth;
}
 
class Knight extends ChessItem
{
void knightMove()
{
//code that defines,
//how the knight moves
}
}
class Bishop extends ChessItem
{
void bishopMove()
{
//code that defines,
//how the bishop moves
}
}
class Pawn extends ChessItem
{
void pawnMove()
{
//code that defines,
//how the pawn moves
}
}

"Sangat menarik!"

"Tentu saja! Manfaatnya sangat besar dalam proyek yang berisi ribuan objek berbeda dan ratusan kelas. Dalam hal ini, kelas yang dipilih dengan benar tidak hanya dapat menyederhanakan logika secara signifikan, tetapi juga mengurangi kode yang diperlukan hingga sepuluh kali lipat."

"Jadi, apa yang harus kamu lakukan untuk mewarisi kelas?"

"Setelah mendeklarasikan sebuah kelas, kita menggunakan kata kunci ' extends ', diikuti dengan nama kelas induknya. Anda hanya dapat mewarisi dari satu kelas. "

Warisan.  Keuntungan warisan - 3

Gambar menunjukkan seekor "sapi" yang diwarisi dari "babi". «Babi» mewarisi dari «ayam», dan «ayam» mewarisi dari «telur». Setiap kelas hanya memiliki satu orang tua! Warisan seperti itu tidak selalu logis. Jika Anda hanya memiliki seekor babi, tetapi Anda benar-benar membutuhkan seekor sapi, programmer seringkali tidak dapat menahan keinginan untuk membuat "sapi" dari "babi".

"Tapi bagaimana jika saya ingin mewarisi dari dua kelas? Apakah ada yang bisa saya lakukan?!"

"Tidak juga. Kelas Java tidak mendukung implementasi pewarisan berganda: sebuah kelas hanya dapat memiliki kelas induk tunggal. Tetapi ada beberapa jenis pewarisan, yang berarti bahwa sebuah kelas dapat mengimplementasikan lebih dari satu antarmuka. Ini sedikit mengurangi masalah. "

"Begitu. Dan apa itu antarmuka?"

"Aku akan memberitahumu tentang antarmuka besok. Untuk saat ini, mari kita lanjutkan mempelajari warisan."