"สวัสดี Amigo! ตอนนี้เป็นหัวข้อที่ฉันคิดว่าคุณต้องใช้มาก ฉันกำลังพูดถึงมรดก "
สำหรับผู้ที่ไม่ได้ฝึกหัด การเขียนโปรแกรมก็เหมือนเวทมนตร์ ผมขอเริ่มด้วยการเปรียบเทียบ...
สมมติว่าคุณเป็นนักมายากลที่ต้องการสร้างม้าบิน คุณสามารถลองเสก Pegasus แต่เนื่องจากม้าบินไม่ได้เกิดขึ้นตามธรรมชาติ คุณจึงมีช่วงเวลาที่ยากลำบากมาก คุณต้องมีงานมากมายที่ต้องทำ มันจะง่ายกว่ามากที่จะเริ่มต้นด้วยม้าและเรียกปีกออกมา
ในการเขียนโปรแกรม เราเรียกกระบวนการนี้ว่า «การสืบทอด» . สมมติว่าคุณต้องเขียนคลาสที่ซับซ้อนมาก คุณอาจใช้เวลานานในการเขียนโค้ดตั้งแต่เริ่มต้น จากนั้นจึงทำการทดสอบแบบยาวเพื่อหาจุดบกพร่อง แต่ทำไมมันยากจัง ดีกว่าที่จะมองไปรอบ ๆ และดูว่าชั้นเรียนที่คุณกำลังมองหามีอยู่แล้วหรือไม่?
สมมติว่าคุณพบคลาสที่ใช้ฟังก์ชัน 80% ที่คุณต้องการ คุณเพียงแค่คัดลอกรหัสไปยังชั้นเรียนของคุณ แต่นั่นจะมีข้อเสียหลายประการ:
1) คลาสที่คุณพบอาจถูกคอมไพล์เป็น bytecode แล้ว คุณอาจไม่สามารถเข้าถึงซอร์สโค้ดได้
2) คุณอาจมีซอร์สโค้ดสำหรับชั้นเรียน แต่ยังทำงานในบริษัทที่อาจถูกฟ้องเรียกเงินสองพันล้านถ้าคุณใช้โค้ดของคนอื่นถึง 6 บรรทัด แล้วพวกเขาจะฟ้องคุณ
3) สิ่งนี้นำไปสู่การทำซ้ำรหัสจำนวนมากโดยไม่จำเป็น และหากผู้เขียนของคลาสอื่นพบข้อบกพร่องและแก้ไข คุณก็ยังมีข้อผิดพลาดนั้นอยู่
มีโซลูชันที่สวยงามกว่าที่ไม่ต้องได้รับอนุญาตตามกฎหมายสำหรับรหัสของคลาสดั้งเดิม ใน Java คุณสามารถประกาศคลาสอื่นเป็นพาเรนต์ของคลาสของคุณ ซึ่งเทียบเท่ากับการเพิ่มรหัสของชั้นเรียนนั้นในชั้นเรียนของคุณเอง ข้อมูลและเมธอดทั้งหมดของคลาสพาเรนต์จะปรากฏในคลาสของคุณ ตัวอย่างเช่น คุณสามารถรับมรดกจาก «ม้า» เพิ่ม «ปีก» และรับ «เพกาซัส»
"น่าสนใจมาก ไปต่อเถอะ"
"การสืบทอดมีประโยชน์อย่างอื่นด้วย สมมติว่าคุณมีสิบคลาสที่คล้ายกันมาก พวกมันมีข้อมูลและวิธีการที่ตรงกัน คุณสามารถสร้างคลาสพื้นฐานพิเศษย้ายข้อมูล (และเมธอดที่เกี่ยวข้อง) ไปยังคลาสพื้นฐานและมีสิบคลาสเหล่านั้น สืบทอดจากมัน กล่าวอีกนัยหนึ่งสำหรับแต่ละคลาส คุณระบุว่ามีคลาสหลักหรือที่เรียกว่าคลาสพื้นฐาน"
"เช่นเดียวกับที่ข้อดีของสิ่งที่เป็นนามธรรมถูกเปิดเผยอย่างแท้จริงโดยเกี่ยวข้องกับการห่อหุ้มเท่านั้น ข้อดีของการถ่ายทอดทางพันธุกรรมก็ขยายใหญ่ขึ้นด้วยความหลากหลายแต่ฉันจะบอกคุณเกี่ยวกับเรื่องนี้ในวันพรุ่งนี้ วันนี้เรามาดูตัวอย่างบางส่วนของการถ่ายทอดทางพันธุกรรมกัน"
"สมมติว่าเรากำลังเขียนโปรแกรมหมากรุก เราต้องการคลาสสำหรับตัวหมากรุก คุณจะแนะนำคลาสไหน Amigo"
"ราชา, ราชินี, บิชอป, อัศวิน, Rook และ Pawn"
“ดีมาก คุณไม่ได้พลาดอะไรเลย”
"และข้อมูลใดที่คุณจะแนะนำให้จัดเก็บในชั้นเรียนเหล่านี้"
"ตำแหน่งกระดาน (x และ y) และมูลค่าของกระดานแต่ละชิ้น ท้ายที่สุดแล้ว บางชิ้นมีค่ามากกว่าชิ้นอื่น"
"และความแตกต่างระหว่างคลาสเหล่านี้คืออะไร"
"พวกเขาแตกต่างกันในวิธีการเดินหมาก ในพฤติกรรมของพวกเขา"
"ใช่ คุณสามารถกำหนดเป็นคลาสได้ดังนี้:"
|
|
|
|
|
|
“ใช่ ฉันจะเขียนอย่างนั้น”
"แต่ดูวิธีที่คุณสามารถใช้การสืบทอดเพื่อเขียนโค้ดน้อยลง เราสามารถย้ายเมธอดและข้อมูลเหมือนกันไปยังคลาสทั่วไปได้ เรียกมันว่า ChessItem มันไม่สมเหตุสมผลที่จะสร้างวัตถุ ChessItem เนื่องจากมันไม่สอดคล้องกับสิ่งใดๆ ตัวหมากรุกแต่ชั้นเรียนจะมีประโยชน์อย่างยิ่ง:"
|
|
|
|
||
|
|
|
"น่าสนใจจัง!"
"แน่นอน! ประโยชน์มีมากโดยเฉพาะอย่างยิ่งในโครงการที่มีอ็อบเจกต์ต่างๆ นับพันและคลาสหลายร้อยคลาส ในกรณีนี้ คลาสที่เลือกอย่างเหมาะสมไม่เพียงแต่จะทำให้ลอจิกง่ายขึ้นเท่านั้น แต่ยังลดโค้ดที่จำเป็นลงได้ถึง 10 เท่า"
“แล้วต้องทำยังไงถึงจะสืบทอดคลาสได้”
"หลังจากประกาศคลาสแล้ว เราใช้คีย์เวิร์ด ' extends ' ตามด้วยชื่อคลาสพาเรนต์คุณสามารถสืบทอดจากคลาสเดียวเท่านั้น "
รูปภาพแสดง "วัว" ที่สืบทอดมาจาก «หมู» «หมู» สืบทอดมาจาก «ไก่» และ «ไก่» สืบทอดมาจาก «ไข่» แต่ละชั้นเรียนมีผู้ปกครองเพียงคนเดียว! มรดกดังกล่าวไม่สมเหตุสมผลเสมอไป หากคุณมีแค่หมู แต่คุณต้องการวัวจริงๆ โปรแกรมเมอร์มักจะไม่สามารถต้านทานความปรารถนาที่จะสร้าง «วัว» จาก «หมู» ได้
"แต่ถ้าฉันต้องการสืบทอดจากสองคลาสล่ะ? มีอะไรที่ฉันสามารถทำได้ไหม?!"
"ไม่จริง คลาส Java ไม่รองรับการสืบทอดการใช้งานหลายรายการ: คลาสสามารถมีคลาสพาเรนต์ได้เพียงคลาสเดียวเท่านั้น แต่มีการสืบทอดหลายประเภท ซึ่งหมายความว่าคลาสหนึ่งสามารถใช้อินเทอร์เฟซมากกว่าหนึ่งอินเทอร์เฟซ ซึ่งช่วยลดปัญหาได้เล็กน้อย "
"ฉันเข้าใจ แล้วอินเทอร์เฟซคืออะไร"
"ฉันจะบอกคุณเกี่ยวกับอินเทอร์เฟซในวันพรุ่งนี้ สำหรับตอนนี้ เรามาเจาะลึกเรื่องการสืบทอดกันต่อ"
GO TO FULL VERSION