"Hello, Amigo! Sekarang ini topik yang saya rasa anda akan gunakan banyak perkara. Saya bercakap tentang warisan. "

Bagi yang belum tahu, pengaturcaraan adalah seperti sihir. Jadi saya mulakan dengan analogi…

Katakan anda seorang ahli silap mata yang ingin mencipta kuda terbang. Anda boleh cuba menyihir Pegasus. Tetapi kerana kuda terbang tidak berlaku secara semula jadi, anda akan menghadapi masa yang sukar. Anda akan mempunyai banyak kerja untuk dilakukan. Ia akan menjadi lebih mudah untuk memulakan dengan kuda dan memanggil beberapa sayap.

Warisan.  Kelebihan harta pusaka - 1

Dalam pengaturcaraan, kami memanggil proses ini «warisan» . Katakan anda perlu menulis kelas yang sangat kompleks. Anda boleh menghabiskan masa yang lama menulis kod dari awal, dan kemudian melakukan ujian yang panjang untuk mencari pepijat. Tetapi mengapa melakukannya dengan cara yang sukar? Adalah lebih baik untuk melihat sekeliling dan melihat sama ada kelas yang anda cari sudah wujud?

Katakan anda menemui kelas yang melaksanakan 80% fungsi yang anda perlukan. Anda hanya boleh menyalin kodnya ke dalam kelas anda. Tetapi itu akan mempunyai beberapa kelemahan:

1) Kelas yang anda temui mungkin sudah disusun ke dalam bytecode. Anda mungkin tidak mempunyai akses kepada kod sumbernya.

2) Anda mungkin mempunyai kod sumber untuk kelas itu, tetapi juga bekerja di syarikat yang boleh disaman untuk beberapa bilion jika anda menggunakan walaupun 6 baris kod orang lain. Dan kemudian mereka akan menyaman anda.

3) Ini membawa kepada pertindihan banyak kod yang tidak perlu. Dan jika pengarang kelas lain menemui pepijat dan membetulkannya, anda masih mempunyai pepijat.

Terdapat penyelesaian yang lebih elegan yang tidak memerlukan kebenaran undang-undang untuk kod kelas asal. Di Java, anda hanya boleh mengisytiharkan kelas lain sebagai induk kelas anda. Ini bersamaan dengan menambah kod kelas itu ke kelas anda sendiri. Semua data dan kaedah kelas induk akan muncul dalam kelas anda. Sebagai contoh, anda boleh mewarisi daripada «kuda», menambah «sayap», dan mendapatkan «Pegasus».

Warisan.  Kelebihan harta pusaka - 2

"Sangat menarik. Sila teruskan."

"Warisan mempunyai kegunaan lain juga. Katakan anda mempunyai sepuluh kelas yang sangat serupa. Mereka mempunyai data dan kaedah yang sepadan. Anda boleh mencipta kelas asas khas , memindahkan data (dan kaedah yang berkaitan) ke kelas asas dan mempunyai sepuluh kelas itu mewarisi daripadanya. Dalam erti kata lain, untuk setiap kelas, anda menunjukkan bahawa ia mempunyai kelas induk, juga dikenali sebagai kelas asas."

"Sama seperti kelebihan pengabstrakan hanya benar-benar didedahkan berkaitan dengan enkapsulasi, kelebihan pewarisan diperbesarkan oleh polimorfisme. Tetapi saya akan memberitahu anda mengenainya esok. Hari ini mari kita lihat beberapa contoh pewarisan."

"Andaikata kita sedang menulis program catur. Kita perlukan kelas untuk buah catur itu. Kelas mana yang kamu cadangkan, Amigo?"

"Raja, Ratu, Bishop, Knight, Rook, dan Pawn."

"Sangat bagus. Awak tak terlepas apa-apa pun."

"Dan apakah data yang anda cadangkan untuk disimpan dalam kelas ini?"

"Kedudukan papan setiap keping (x dan y) dan bernilai. Lagipun, beberapa keping lebih berharga daripada yang lain."

"Dan apakah perbezaan antara kelas ini?"

"Mereka berbeza dalam cara mereka menggerakkan kepingan. Dalam tingkah laku mereka."

"Ya. Anda boleh mentakrifkannya 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, itulah cara saya menulisnya."

"Tetapi lihat bagaimana anda boleh menggunakan warisan untuk menulis kurang kod. Kami boleh memindahkan kaedah dan data yang sama ke dalam kelas biasa. Mari kita panggil ia ChessItem. Tidak masuk akal untuk mencipta objek ChessItem, kerana ia tidak sepadan dengan mana-mana sekeping catur. Tetapi 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
}
}

"Sungguh menarik!"

"Sama sekali! Faedahnya sangat besar dalam projek yang mengandungi beribu-ribu objek berbeza dan beratus-ratus kelas. Dalam kes ini, kelas yang dipilih dengan betul bukan sahaja dapat memudahkan logik dengan ketara, tetapi juga mengurangkan kod yang diperlukan dengan faktor sepuluh."

"Jadi apa yang anda perlu lakukan untuk mewarisi kelas?"

"Selepas mengisytiharkan kelas, kami menggunakan kata kunci ' extends ', diikuti dengan nama kelas induk. Anda hanya boleh mewarisi daripada satu kelas. "

Warisan.  Kelebihan harta pusaka - 3

Gambar menunjukkan "lembu" yang telah diwarisi daripada «babi». «Babi» mewarisi daripada «ayam», dan «ayam» mewarisi daripada «telur». Setiap kelas hanya mempunyai seorang ibu bapa! Warisan sedemikian tidak selalu logik. Jika anda hanya mempunyai babi, tetapi anda benar-benar memerlukan seekor lembu, pengaturcara selalunya tidak dapat menahan keinginan untuk membuat «lembu» daripada «babi».

"Tetapi bagaimana jika saya ingin mewarisi dari dua kelas? Ada apa-apa yang boleh saya lakukan?!"

"Tidak juga. Kelas Java tidak menyokong berbilang warisan pelaksanaan: kelas hanya boleh mempunyai kelas induk tunggal. Tetapi terdapat berbilang warisan jenis, yang bermaksud bahawa kelas boleh melaksanakan lebih daripada satu antara muka. Ini mengurangkan sedikit masalah. "

"Saya faham. Dan apakah antara muka?"

"Saya akan memberitahu anda tentang antara muka esok. Buat masa ini, mari kita teruskan mendalami warisan."