"Halo, Amigo! Saiki ana topik sing dakkira sampeyan bakal nggunakake akeh. Aku ngomong babagan warisan. "

Kanggo sing durung ngerti, pemrograman kaya sihir. Dadi ayo miwiti karo analogi ...

Upamane sampeyan tukang sulap sing pengin nggawe jaran mabur. Sampeyan bisa nyoba conjuring Pegasus. Nanging amarga jaran mabur ora kedadeyan kanthi alami, sampeyan bakal angel banget. Sampeyan bakal duwe akeh karya. Iku bakal luwih gampang kanggo miwiti karo jaran lan nelpon sawetara swiwi.

pusaka.  Kaluwihan saka warisan - 1

Ing program, kita nelpon proses iki «warisan» . Upaminipun sampeyan kudu nulis kelas banget Komplek. Sampeyan bisa nggunakake wektu suwe kanggo nulis kode saka awal, banjur nindakake tes dawa kanggo nemokake bug. Nanging kenapa nindakake kanthi cara sing angel? Iku luwih apik kanggo nggoleki lan ndeleng apa kelas sing sampeyan goleki wis ana?

Contone, sampeyan nemokake kelas sing ngetrapake 80% fungsi sing dibutuhake. Sampeyan mung bisa nyalin kode menyang kelas sampeyan. Nanging iki bakal duwe sawetara kekurangan:

1) Kelas sing sampeyan temokake bisa uga wis dikompilasi dadi bytecode. Sampeyan bisa uga ora duwe akses menyang kode sumber.

2) Sampeyan bisa uga duwe kode sumber kanggo kelas, nanging uga bisa ing perusahaan sing bisa digugat kanggo saperangan milyar yen sampeyan nggunakake malah 6 baris kode wong liya. Banjur dheweke bakal nuntut sampeyan.

3) Iki nyebabake duplikasi akeh kode sing ora perlu. Lan yen penulis kelas liyane nemokake bug lan ndandani, sampeyan isih duwe bug.

Ana solusi sing luwih elegan sing ora mbutuhake ijin legal kanggo kode kelas asli. Ing Jawa, sampeyan mung bisa nyatakake kelas liyane minangka wong tuwa kelas sampeyan. Iki padha karo nambah kode kelas kasebut menyang kelas sampeyan dhewe. Kabeh data lan cara kelas induk bakal katon ing kelas sampeyan. Contone, sampeyan bisa oleh warisan saka «jaran», nambah «wings», lan njaluk «Pegasus».

pusaka.  Kaluwihan saka warisan - 2

"Apik banget. Mangga diterusake."

"Warisan uga nduweni kegunaan liyane. Upaminipun sampeyan duwe sepuluh kelas sing meh padha. Padha duwe data lan metode sing cocog. Sampeyan bisa nggawe kelas basis khusus , mindhah data (lan cara sing gegandhengan) menyang kelas dasar , lan duwe sepuluh kelas kasebut. Warisan saka iku. Ing tembung liyane, kanggo saben kelas, sampeyan nuduhake yen ana kelas induk, uga dikenal minangka kelas dasar."

"Kaya kaluwihan abstraksi mung dicethakaké ana hubungane karo enkapsulasi, kaluwihan warisan digedhekake dening polimorfisme. Nanging sesuk aku bakal ngandhani sampeyan. Dina iki ayo deleng sawetara conto warisan."

"Muga-muga kita nulis program catur. Kita butuh kelas kanggo catur. Kelas apa sing sampeyan saranake, Amigo?"

"Raja, Ratu, Uskup, Ksatria, Rook, lan Pion."

"Apik banget. Sampeyan ora kantun apa-apa."

"Lan data apa sing sampeyan saranake disimpen ing kelas kasebut?"

"Posisi papan saben potongan (x lan y) lan regane. Sawise kabeh, sawetara potongan luwih larang tinimbang liyane."

"Lan apa bedane antarane kelas kasebut?"

"Dheweke beda-beda babagan cara mindhah potongan kasebut. Ing prilaku."

"Ya. Sampeyan bisa nemtokake dheweke minangka kelas kaya iki:"

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, kaya ngono aku bakal nulis."

"Nanging delengen carane sampeyan bisa nggunakake warisan kanggo nulis kode sing kurang. Kita bisa mindhah cara lan data sing padha menyang kelas umum. Ayo diarani ChessItem. Ora ana gunane kanggo nggawe obyek ChessItem, amarga ora cocog karo apa wae. catur. Nanging kelas bakal banget mbiyantu:"

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
}
}

"Carane menarik!"

"Pancen! Manfaat utamane gedhe ing proyek sing ngemot ewonan obyek sing beda-beda lan atusan kelas. Ing kasus iki, kelas sing dipilih kanthi bener ora mung bisa nyederhanakake logika, nanging uga nyuda kode sing dibutuhake kanthi faktor sepuluh."

"Dadi apa sing kudu sampeyan lakoni kanggo entuk warisan kelas?"

"Sawise ngumumake kelas, kita nggunakake tembung kunci ' ngluwihi ', ngiring dening jeneng kelas induk. Sampeyan mung bisa oleh warisan saka siji kelas .

pusaka.  Kaluwihan saka warisan - 3

Gambar nuduhake "sapi" sing wis warisan saka «babi». «Babi» warisan saka «pitik», lan «pitik» warisan saka «endhog». Saben kelas mung duwe wong tuwa siji! Warisan kuwi ora mesthi logis. Yen sampeyan mung duwe babi, nanging sampeyan pancene kudu sapi, programer asring ora bisa nolak kepinginan kanggo nggawe «sapi» metu saka «babi».

"Nanging yen aku pengin entuk warisan saka rong kelas? Apa ana sing bisa daklakoni?!"

"Ora tenan. Kelas Jawa ora ndhukung sawetara warisan saka implementasine: kelas mung bisa duwe kelas induk siji. Nanging ana sawetara warisan saka jinis, kang tegese kelas bisa ngleksanakake luwih saka siji antarmuka. Iki rada mitigates masalah. "

"Aku weruh. Lan apa antarmuka?"

"Aku bakal pitutur marang kowe bab antarmuka sesuk. Kanggo saiki, ayo kang nerusake delving menyang warisan."