1. Pegasus

Mari kita lihat dengan lebih mendalam prinsip ketiga OOP : warisan . Ini adalah topik yang sangat menarik yang akan anda gunakan selalu. Kepada yang belum tahu, pengaturcaraan tidak dapat dibezakan daripada sihir. Jadi mari kita mulakan dengan analogi yang menarik...;

Katakan anda seorang ahli sihir yang ingin mencipta kuda terbang. Di satu pihak, anda boleh cuba membuat pegasus. Tetapi kerana pegasi tidak wujud secara semula jadi, ini akan menjadi sangat sukar. Anda perlu melakukan banyak perkara sendiri. Lebih mudah untuk mengambil kuda dan membuat sayapnya.

Dalam pengaturcaraan, proses ini dipanggil "warisan". Katakan anda perlu menulis kelas yang sangat kompleks. Ia mengambil masa yang lama untuk menulis kod dari awal dan kemudian menguji segala-galanya untuk masa yang lama untuk mencari ralat. Mengapa pergi dengan cara yang sukar? Adalah lebih baik untuk melihat sama ada kelas sedemikian sudah wujud.

Katakan anda menemui kelas yang kaedahnya melaksanakan 80% fungsi yang anda perlukan. Apa yang anda lakukan dengannya seterusnya? Anda hanya boleh menyalin kodnya ke dalam kelas anda. Tetapi penyelesaian ini mempunyai beberapa kelemahan:

  1. Kelas yang anda temui mungkin sudah disusun menjadi kod bait dan anda mungkin tidak mempunyai akses kepada kod sumbernya.
  2. Kod sumber kelas itu tersedia, tetapi anda bekerja untuk sebuah syarikat yang boleh disaman untuk beberapa bilion kerana menggunakan walaupun 6 baris kod orang lain. Dan kemudian majikan anda akan menyaman anda.
  3. Penduaan yang tidak perlu bagi sejumlah besar kod. Selain itu, jika pengarang kelas luaran menemui pepijat di dalamnya dan membetulkannya, anda masih akan mengalami pepijat itu.

Terdapat penyelesaian yang lebih elegan, dan ia tidak memerlukan akses undang-undang kepada kod kelas asal. Di Java, anda hanya boleh mengisytiharkan kelas itu sebagai induk kelas anda. Itu akan bersamaan dengan menambah kod untuk kelas itu kepada kod anda sendiri. Kelas anda akan melihat semua data dan semua kaedah kelas induk. Sebagai contoh, anda boleh melakukan ini: kami mewarisi "kuda" dan kemudian menambah "sayap" untuk mendapatkan "pegasus"


2. Kelas asas biasa

Warisan boleh digunakan untuk tujuan lain juga. Katakan anda mempunyai sepuluh kelas yang hampir sama. Mereka mempunyai data dan kaedah yang sama. Anda boleh mencipta kelas asas khas, memindahkan data (dan kaedah yang berkaitan) ke dalam kelas asas ini dan mengisytiharkan sepuluh kelas tersebut sebagai keturunan. Dengan kata lain, dalam setiap kelas menunjukkan bahawa kelas induknya ialah kelas asas ini.

Sama seperti kelebihan pengabstrakan didedahkan hanya di sepanjang pengkapsulan sisi, begitu juga kelebihan pewarisan lebih dipertingkatkan apabila menggunakan polimorfisme. Tetapi anda akan belajar tentang itu sedikit kemudian. Hari ini kita akan melihat beberapa contoh penggunaan warisan.

Buah catur

Katakan kita sedang menulis program yang bermain catur dengan pengguna manusia. Sehubungan itu, kami memerlukan kelas untuk mewakili kepingan. Apakah kelas mereka?

Jika anda pernah bermain catur, jawapan yang jelas ialah Raja, Ratu, Bishop, Knight, Rook dan Pawn.

Tetapi kelas itu sendiri masih perlu menyimpan maklumat tentang setiap bahagian. Sebagai contoh, koordinat x dan y, dan nilai kepingan. Lagipun, beberapa kepingan lebih berharga daripada yang lain.

Di samping itu, kepingan bergerak secara berbeza, yang bermaksud bahawa kelas akan melaksanakan tingkah laku yang berbeza. Begini cara anda boleh mentakrifkannya 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 penerangan yang sangat primitif tentang buah catur.

Kelas asas biasa

Dan inilah cara anda boleh menggunakan warisan untuk mengurangkan jumlah kod. Kita boleh membawa kaedah dan data biasa ke dalam kelas biasa. Kami akan memanggilnya ChessItem. Tiada gunanya mencipta objek ChessItem class, kerana kelas itu tidak sepadan dengan mana-mana buah catur . Yang berkata, 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 memudahkan kod untuk objek yang serupa. Faedahnya amat ketara apabila terdapat beribu-ribu objek yang berbeza dan beratus-ratus kelas dalam projek itu. Jadi kelas induk (asas) yang dipilih dengan betul membolehkan anda bukan sahaja memudahkan logik, tetapi juga mengurangkan kod sepuluh kali ganda.


3. Warisan kelas -extends

Jadi apa yang diperlukan untuk mewarisi kelas? Untuk satu kelas mewarisi yang lain, anda perlu menulis extendskata kunci selepas pengisytiharan kelas anak dan kemudian tulis nama kelas induk. Ia biasanya kelihatan seperti ini:

class Descendant extends Parent

Inilah yang anda perlu tulis semasa mengisytiharkan kelas Descendant. By the way, kelas boleh mewarisi hanya satu kelas.

Dalam gambar, kita melihat bahawa seekor lembu mewarisi babi, yang mewarisi ayam, yang mewarisi telur. Hanya seorang ibu bapa! Warisan sedemikian tidak selalu logik. Tetapi apabila semua yang anda ada hanyalah seekor babi dan anda benar-benar memerlukan seekor lembu, pengaturcara selalunya tidak dapat menahan keinginan untuk membuat lembu daripada babi.

Java tidak mempunyai banyak warisan: kelas tidak boleh mewarisi dua kelas. Setiap kelas hanya boleh mempunyai satu kelas induk. Jika tiada kelas induk ditentukan, kelas induk ialah Object.

Walau bagaimanapun, Java mempunyai pelbagai warisan antara muka. Ini mengurangkan sedikit masalah. Kita akan bercakap tentang antara muka sedikit kemudian, tetapi buat masa ini mari kita teruskan meneroka warisan.