"สวัสดี Amigo! ตอนนี้เป็นหัวข้อที่ฉันคิดว่าคุณต้องใช้มาก ฉันกำลังพูดถึงมรดก "

สำหรับผู้ที่ไม่ได้ฝึกหัด การเขียนโปรแกรมก็เหมือนเวทมนตร์ ผมขอเริ่มด้วยการเปรียบเทียบ...

สมมติว่าคุณเป็นนักมายากลที่ต้องการสร้างม้าบิน คุณสามารถลองเสก Pegasus แต่เนื่องจากม้าบินไม่ได้เกิดขึ้นตามธรรมชาติ คุณจึงมีช่วงเวลาที่ยากลำบากมาก คุณต้องมีงานมากมายที่ต้องทำ มันจะง่ายกว่ามากที่จะเริ่มต้นด้วยม้าและเรียกปีกออกมา

มรดก  ข้อดีของการสืบทอด - 1

ในการเขียนโปรแกรม เราเรียกกระบวนการนี้ว่า «การสืบทอด» . สมมติว่าคุณต้องเขียนคลาสที่ซับซ้อนมาก คุณอาจใช้เวลานานในการเขียนโค้ดตั้งแต่เริ่มต้น จากนั้นจึงทำการทดสอบแบบยาวเพื่อหาจุดบกพร่อง แต่ทำไมมันยากจัง ดีกว่าที่จะมองไปรอบ ๆ และดูว่าชั้นเรียนที่คุณกำลังมองหามีอยู่แล้วหรือไม่?

สมมติว่าคุณพบคลาสที่ใช้ฟังก์ชัน 80% ที่คุณต้องการ คุณเพียงแค่คัดลอกรหัสไปยังชั้นเรียนของคุณ แต่นั่นจะมีข้อเสียหลายประการ:

1) คลาสที่คุณพบอาจถูกคอมไพล์เป็น bytecode แล้ว คุณอาจไม่สามารถเข้าถึงซอร์สโค้ดได้

2) คุณอาจมีซอร์สโค้ดสำหรับชั้นเรียน แต่ยังทำงานในบริษัทที่อาจถูกฟ้องเรียกเงินสองพันล้านถ้าคุณใช้โค้ดของคนอื่นถึง 6 บรรทัด แล้วพวกเขาจะฟ้องคุณ

3) สิ่งนี้นำไปสู่การทำซ้ำรหัสจำนวนมากโดยไม่จำเป็น และหากผู้เขียนของคลาสอื่นพบข้อบกพร่องและแก้ไข คุณก็ยังมีข้อผิดพลาดนั้นอยู่

มีโซลูชันที่สวยงามกว่าที่ไม่ต้องได้รับอนุญาตตามกฎหมายสำหรับรหัสของคลาสดั้งเดิม ใน Java คุณสามารถประกาศคลาสอื่นเป็นพาเรนต์ของคลาสของคุณ ซึ่งเทียบเท่ากับการเพิ่มรหัสของชั้นเรียนนั้นในชั้นเรียนของคุณเอง ข้อมูลและเมธอดทั้งหมดของคลาสพาเรนต์จะปรากฏในคลาสของคุณ ตัวอย่างเช่น คุณสามารถรับมรดกจาก «ม้า» เพิ่ม «ปีก» และรับ «เพกาซัส»

มรดก  ข้อดีของการสืบทอด - 2

"น่าสนใจมาก ไปต่อเถอะ"

"การสืบทอดมีประโยชน์อย่างอื่นด้วย สมมติว่าคุณมีสิบคลาสที่คล้ายกันมาก พวกมันมีข้อมูลและวิธีการที่ตรงกัน คุณสามารถสร้างคลาสพื้นฐานพิเศษย้ายข้อมูล (และเมธอดที่เกี่ยวข้อง) ไปยังคลาสพื้นฐานและมีสิบคลาสเหล่านั้น สืบทอดจากมัน กล่าวอีกนัยหนึ่งสำหรับแต่ละคลาส คุณระบุว่ามีคลาสหลักหรือที่เรียกว่าคลาสพื้นฐาน"

"เช่นเดียวกับที่ข้อดีของสิ่งที่เป็นนามธรรมถูกเปิดเผยอย่างแท้จริงโดยเกี่ยวข้องกับการห่อหุ้มเท่านั้น ข้อดีของการถ่ายทอดทางพันธุกรรมก็ขยายใหญ่ขึ้นด้วยความหลากหลายแต่ฉันจะบอกคุณเกี่ยวกับเรื่องนี้ในวันพรุ่งนี้ วันนี้เรามาดูตัวอย่างบางส่วนของการถ่ายทอดทางพันธุกรรมกัน"

"สมมติว่าเรากำลังเขียนโปรแกรมหมากรุก เราต้องการคลาสสำหรับตัวหมากรุก คุณจะแนะนำคลาสไหน Amigo"

"ราชา, ราชินี, บิชอป, อัศวิน, Rook และ Pawn"

“ดีมาก คุณไม่ได้พลาดอะไรเลย”

"และข้อมูลใดที่คุณจะแนะนำให้จัดเก็บในชั้นเรียนเหล่านี้"

"ตำแหน่งกระดาน (x และ y) และมูลค่าของกระดานแต่ละชิ้น ท้ายที่สุดแล้ว บางชิ้นมีค่ามากกว่าชิ้นอื่น"

"และความแตกต่างระหว่างคลาสเหล่านี้คืออะไร"

"พวกเขาแตกต่างกันในวิธีการเดินหมาก ในพฤติกรรมของพวกเขา"

"ใช่ คุณสามารถกำหนดเป็นคลาสได้ดังนี้:"

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

“ใช่ ฉันจะเขียนอย่างนั้น”

"แต่ดูวิธีที่คุณสามารถใช้การสืบทอดเพื่อเขียนโค้ดน้อยลง เราสามารถย้ายเมธอดและข้อมูลเหมือนกันไปยังคลาสทั่วไปได้ เรียกมันว่า ChessItem มันไม่สมเหตุสมผลที่จะสร้างวัตถุ ChessItem เนื่องจากมันไม่สอดคล้องกับสิ่งใดๆ ตัวหมากรุกแต่ชั้นเรียนจะมีประโยชน์อย่างยิ่ง:"

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

"น่าสนใจจัง!"

"แน่นอน! ประโยชน์มีมากโดยเฉพาะอย่างยิ่งในโครงการที่มีอ็อบเจกต์ต่างๆ นับพันและคลาสหลายร้อยคลาส ในกรณีนี้ คลาสที่เลือกอย่างเหมาะสมไม่เพียงแต่จะทำให้ลอจิกง่ายขึ้นเท่านั้น แต่ยังลดโค้ดที่จำเป็นลงได้ถึง 10 เท่า"

“แล้วต้องทำยังไงถึงจะสืบทอดคลาสได้”

"หลังจากประกาศคลาสแล้ว เราใช้คีย์เวิร์ด ' extends ' ตามด้วยชื่อคลาสพาเรนต์คุณสามารถสืบทอดจากคลาสเดียวเท่านั้น "

มรดก  ข้อดีของการสืบทอด - 3

รูปภาพแสดง "วัว" ที่สืบทอดมาจาก «หมู» «หมู» สืบทอดมาจาก «ไก่» และ «ไก่» สืบทอดมาจาก «ไข่» แต่ละชั้นเรียนมีผู้ปกครองเพียงคนเดียว! มรดกดังกล่าวไม่สมเหตุสมผลเสมอไป หากคุณมีแค่หมู แต่คุณต้องการวัวจริงๆ โปรแกรมเมอร์มักจะไม่สามารถต้านทานความปรารถนาที่จะสร้าง «วัว» จาก «หมู» ได้

"แต่ถ้าฉันต้องการสืบทอดจากสองคลาสล่ะ? มีอะไรที่ฉันสามารถทำได้ไหม?!"

"ไม่จริง คลาส Java ไม่รองรับการสืบทอดการใช้งานหลายรายการ: คลาสสามารถมีคลาสพาเรนต์ได้เพียงคลาสเดียวเท่านั้น แต่มีการสืบทอดหลายประเภท ซึ่งหมายความว่าคลาสหนึ่งสามารถใช้อินเทอร์เฟซมากกว่าหนึ่งอินเทอร์เฟซ ซึ่งช่วยลดปัญหาได้เล็กน้อย "

"ฉันเข้าใจ แล้วอินเทอร์เฟซคืออะไร"

"ฉันจะบอกคุณเกี่ยวกับอินเทอร์เฟซในวันพรุ่งนี้ สำหรับตอนนี้ เรามาเจาะลึกเรื่องการสืบทอดกันต่อ"