1. Pegasus

Mari kita lihat lebih dalam prinsip ketiga OOP : warisan . Ini adalah topik yang sangat menarik yang akan sering Anda gunakan. Bagi yang belum tahu, pemrograman tidak bisa dibedakan dari sihir. Jadi mari kita mulai dengan analogi yang menarik...;

Misalkan Anda adalah seorang penyihir yang ingin membuat kuda terbang. Di satu sisi, Anda bisa mencoba menyulap pegasus. Tapi karena pegasi tidak ada di alam, ini akan sangat sulit. Anda harus melakukan banyak hal sendiri. Jauh lebih mudah mengambil seekor kuda dan menyulap sayapnya.

Dalam pemrograman, proses ini disebut "warisan". Misalkan Anda perlu menulis kelas yang sangat kompleks. Butuh waktu lama untuk menulis kode dari awal dan kemudian menguji semuanya dalam waktu lama untuk mencari kesalahan. Mengapa menempuh jalan yang sulit? Lebih baik melihat apakah kelas seperti itu sudah ada.

Misalkan Anda menemukan kelas yang metodenya mengimplementasikan 80% fungsionalitas yang Anda butuhkan. Apa yang Anda lakukan selanjutnya? Anda bisa menyalin kodenya ke kelas Anda. Tetapi solusi ini memiliki beberapa kelemahan:

  1. Kelas yang Anda temukan mungkin sudah dikompilasi menjadi bytecode, dan Anda mungkin tidak memiliki akses ke kode sumbernya.
  2. Kode sumber kelas tersedia, tetapi Anda bekerja untuk perusahaan yang dapat dituntut beberapa miliar karena menggunakan bahkan 6 baris kode orang lain. Dan kemudian majikan Anda akan menuntut Anda.
  3. Duplikasi yang tidak perlu dari sejumlah besar kode. Selain itu, jika pembuat kelas eksternal menemukan bug di dalamnya dan memperbaikinya, Anda akan tetap memiliki bug tersebut.

Ada solusi yang lebih elegan, dan tidak memerlukan akses legal ke kode kelas asli. Di Java, Anda cukup mendeklarasikan kelas itu sebagai induk dari kelas Anda. Itu sama dengan menambahkan kode untuk kelas itu ke kode Anda sendiri. Kelas Anda akan melihat semua data dan semua metode kelas induk. Misalnya, Anda dapat melakukan ini: kami mewarisi "kuda" dan kemudian menambahkan "sayap" untuk mendapatkan "pegasus"


2. Kelas dasar umum

Warisan dapat digunakan untuk tujuan lain juga. Katakanlah Anda memiliki sepuluh kelas yang sangat mirip. Mereka memiliki data dan metode yang sama. Anda dapat membuat kelas dasar khusus, memindahkan data (dan metode terkait) ke dalam kelas dasar ini, dan mendeklarasikan kesepuluh kelas tersebut sebagai keturunan. Dengan kata lain, di setiap kelas menunjukkan bahwa kelas induknya adalah kelas dasar ini.

Sama seperti keuntungan abstraksi yang terungkap hanya di sepanjang enkapsulasi samping, demikian juga keuntungan pewarisan jauh lebih ditingkatkan saat menggunakan polimorfisme. Tetapi Anda akan mempelajarinya nanti. Hari ini kita akan melihat beberapa contoh penggunaan warisan.

Potongan catur

Misalkan kita sedang menulis sebuah program yang bermain catur dengan pengguna manusia. Oleh karena itu, kita membutuhkan kelas untuk mewakili bagian-bagian tersebut. Akan menjadi kelas apa mereka?

Jika Anda pernah bermain catur, jawaban yang jelas adalah King, Queen, Bishop, Knight, Rook, dan Pion.

Tapi kelas itu sendiri masih perlu menyimpan informasi tentang masing-masing bagian. Misalnya, koordinat x dan y, serta nilai bidak. Lagi pula, beberapa bagian lebih berharga daripada yang lain.

Selain itu, bidak bergerak secara berbeda, yang berarti kelas akan menerapkan perilaku yang berbeda. Inilah cara Anda dapat mendefinisikannya sebagai kelas:

class King
{
   int x;
   int y;
   int worth;

   void kingMove()
   {
     // Code that decides
     // how to move
     // the king
   }
}
class Queen
{
   int x;
   int y;
   int worth;

   void queenMove()
   {
     // Code that decides
     // how to move
     // the queen
   }
}
class Rook
{
   int x;
   int y;
   int worth;

   void rookMove()
   {
     // Code that decides
     // how to move
     // the rook
   }
}
class Knight
{
   int x;
   int y;
   int worth;

   void knightMove()
   {
     // Code that decides
     // how to move
     // the knight
   }
}
class Bishop
{
   int x;
   int y;
   int worth;

   void bishopMove()
   {
     // Code that decides
     // how to move
     // the bishop
   }
}
class Pawn
{
   int x;
   int y;
   int worth;

   void pawnMove()
   {
     // Code that decides
     // how to move
     // the pawn
   }
}

Ini adalah deskripsi bidak catur yang sangat primitif.

Kelas dasar umum

Dan inilah cara Anda menggunakan warisan untuk mengurangi jumlah kode. Kita dapat membawa metode dan data umum ke dalam kelas umum. Kami akan menyebutnya ChessItem. Tidak ada gunanya membuat objek dari ChessItem class, karena kelas tidak sesuai dengan bidak catur mana pun . Yang mengatakan, kelas akan terbukti sangat berguna:

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

Ini adalah cara yang bagus untuk menyederhanakan kode untuk objek serupa. Manfaatnya sangat terlihat ketika ada ribuan objek berbeda dan ratusan kelas dalam proyek. Jadi kelas induk (basis) yang dipilih dengan benar memungkinkan Anda tidak hanya menyederhanakan logika, tetapi juga mengurangi kode sepuluh kali lipat.


3. Warisan kelas —extends

Jadi apa yang diperlukan untuk mewarisi kelas? Agar satu kelas mewarisi yang lain, Anda perlu menulis extendskata kunci setelah deklarasi kelas anak dan kemudian menulis nama kelas induk. Biasanya terlihat seperti ini:

class Descendant extends Parent

Inilah yang perlu Anda tulis saat mendeklarasikan kelas Descendant. Omong-omong, sebuah kelas hanya dapat mewarisi satu kelas.

Pada gambar, kita melihat bahwa seekor sapi mewarisi seekor babi, yang mewarisi seekor ayam, yang mewarisi sebuah telur. Hanya satu orang tua! Warisan seperti itu tidak selalu logis. Tetapi ketika yang Anda miliki hanyalah seekor babi dan Anda benar-benar membutuhkan seekor sapi, para programmer seringkali tidak dapat menahan keinginan untuk membuat seekor sapi dari seekor babi.

Java tidak memiliki pewarisan berganda: sebuah kelas tidak dapat mewarisi dua kelas. Setiap kelas hanya dapat memiliki satu kelas induk. Jika tidak ada kelas induk yang ditentukan, kelas induknya adalah Object.

Yang mengatakan, Java memang memiliki banyak warisan antarmuka. Ini mengurangi masalah sedikit. Kami akan berbicara tentang antarmuka nanti, tetapi untuk saat ini mari kita lanjutkan menjelajahi pewarisan.