ที่มา: FreeCodeCamp Java เป็นหนึ่งในภาษาการเขียนโปรแกรมเชิงวัตถุที่ได้รับความนิยมมากที่สุดภาษาหนึ่งที่ใช้อยู่ในปัจจุบัน เนื่องจากเป็นแพลตฟอร์มที่ไม่ขึ้นกับใคร คุณจึงสามารถค้นหาแอปพลิเคชัน Java ได้บนอุปกรณ์ทุกประเภทและทุกระบบปฏิบัติการ และเนื่องจาก Java ค่อนข้างเรียนรู้ได้ง่าย จึงเป็นหนึ่งในภาษาที่โปรแกรมเมอร์หลายคนเชี่ยวชาญ คุณสมบัติที่สำคัญของ Java ที่คุณควรทำความคุ้นเคยคือการสืบทอดคลาส การสืบทอดช่วยให้คุณเพิ่มประสิทธิภาพโค้ดของคุณ ทำให้ง่ายต่อการนำคลาสกลับมาใช้ใหม่ เมื่อคุณสามารถนำโค้ดที่ได้รับการทดสอบและดีบั๊กแล้วกลับมาใช้ใหม่ได้ วงจรการพัฒนาซอฟต์แวร์จะสั้นลงและมีราคาถูกลง แม้ว่าจะเป็นแนวคิดง่ายๆ ในทางทฤษฎี แต่ความสัมพันธ์ของการสืบทอดการเข้ารหัสจำเป็นต้องใส่ใจในรายละเอียด โดยเฉพาะอย่างยิ่งในส่วนที่เกี่ยวกับการรับมรดกหลายรายการ โดยที่คลาสย่อยหนึ่งคลาสสืบทอดคุณสมบัติจากคลาสพาเรนต์หลายคลาส Java ปฏิเสธความสัมพันธ์ที่สืบทอดหลายรายการเนื่องจากความสัมพันธ์เหล่านี้สร้างความกำกวม แต่มีหลายวิธีในการบรรลุผลเดียวกันหลายประการหากคุณรู้ว่าต้องทำอย่างไร ในบทความนี้ เราจะดูปัญหาเกี่ยวกับการสืบทอดหลายรายการ และหารือเกี่ยวกับตัวเลือกการเข้ารหัสทางเลือกใน Java
คำศัพท์เกี่ยวกับมรดก
บางครั้ง ในการเป็นโปรแกรมเมอร์ที่ประสบความสำเร็จ คุณต้องเป็นนักแก้ปัญหาเพื่อค้นหาวิธีแก้ไขข้อผิดพลาดหรือปัญหาทั่วไป นี่เป็นส่วนสำคัญของการเข้ารหัสที่ปลอดภัยและชาญฉลาด ปัญหาหนึ่งดังกล่าวเกี่ยวข้องกับการสืบทอดหลายรายการ (หรือมากกว่านั้นคือขาดไป) ใน Java เพื่อให้เข้าใจถึงการสืบทอดใน Java อย่างถ่องแท้ คุณจะต้องคุ้นเคยกับคำศัพท์เฉพาะของการสืบทอดพื้นฐานของการเขียนโปรแกรมเชิงวัตถุ (OOP)- คลาสเป็นโครงสร้างพื้นฐานของภาษาโปรแกรมเชิงวัตถุ คลาสกำหนดคุณสมบัติทั่วไปสำหรับกลุ่มของวัตถุ
- คลาสผู้ปกครอง : เรียกอีกอย่างว่าคลาสพื้นฐานหรือคลาสขั้นสูง คลาสพาเรนต์เป็นคลาสที่ขยายได้ซึ่งมีฟังก์ชันการทำงานให้กับคลาสลูก ช่วยให้สามารถนำกลับมาใช้ใหม่ได้ คำจำกัดความและฟังก์ชันของคลาสพาเรนต์จะถูกนำมาใช้ซ้ำเมื่อสร้างคลาสลูก
- คลาสย่อย : โดยทั่วไปเรียกว่าคลาสย่อย คลาสย่อยสืบทอดฟังก์ชันการทำงานจากคลาสอื่น คลาสย่อยเป็นคลาสแบบขยายหรือแบบสืบทอด
- การสืบทอด : ความสัมพันธ์ระหว่างคลาสผู้ปกครองและคลาสลูก
ประเภทการสืบทอด OOP
มีภาษาการเขียนโปรแกรมเชิงวัตถุยอดนิยมมากมายที่ใช้อยู่ในปัจจุบัน รวมถึง Java, C++, JavaScript, Python, PHP, Ruby และ Perl แม้ว่าการสืบทอดจะเป็นแนวคิดทั่วไปในภาษา OOP เหล่านี้ แต่การสืบทอดบางประเภทมีอยู่ในแต่ละภาษาเหล่านี้ เป็นสิ่งสำคัญอย่างยิ่งที่จะต้องทราบประเภทมรดกทั่วไปและข้อจำกัดในการสืบทอดในภาษาเฉพาะที่คุณใช้ ยิ่งคุณรู้เกี่ยวกับการสืบทอดมากเท่าไร คุณก็จะยิ่งเป็นนักพัฒนาที่มีประสิทธิภาพมากขึ้นเท่านั้น ประเภทของมรดกที่ Java รองรับ ได้แก่ :- การสืบทอดระดับเดียว : เมื่อคลาสลูกสืบทอดคุณสมบัติจากคลาสพาเรนต์เดียว
- การสืบทอดหลายระดับ : นี่คือรูปแบบการสืบทอดระดับเดียวหลายระดับ ในการสืบทอดหลายระดับ คลาสลูกยังสามารถทำหน้าที่เป็นคลาสพาเรนต์สำหรับคลาสลูกอื่นได้ ความสัมพันธ์ระหว่างแต่ละระดับเป็นแบบเส้นตรง - ไม่มีสาขาใดที่จะสูงไปกว่าการสืบทอดหลายรายการ ในกรณีนี้ คลาสย่อยสุดท้ายจะมีฟังก์ชันจากทุกระดับข้างต้น
- การสืบทอดแบบลำดับชั้น : สิ่งที่ตรงกันข้ามกับการสืบทอดหลายแบบ ในการสืบทอดแบบลำดับชั้น คลาสพาเรนต์เดี่ยวมีคลาสลูกมากกว่าหนึ่งคลาส แทนที่จะมีกิ่งก้านอยู่เหนือ กลับแตกกิ่งก้านออกไปด้านล่าง
- การสืบทอดแบบลูกผสม : ตามชื่อที่แนะนำ การสืบทอดแบบลูกผสมคือการรวมกันของการสืบทอดประเภทอื่น ๆ
- การสืบทอดหลายรายการ : ในการสืบทอดหลายรายการ คลาสลูกจะมีคลาสพาเรนต์มากกว่าหนึ่งคลาส แม้ว่า Java และ JavaScript จะไม่รองรับการสืบทอดหลายรายการ แต่ภาษา OOP เช่น C++ ก็รองรับได้
- การสืบทอดแบบหลายเส้นทาง : ลูกผสมของการสืบทอดหลายระดับหลายระดับและแบบลำดับชั้น ในการสืบทอดแบบหลายเส้นทาง คลาสลูกจะสืบทอดคุณลักษณะและฟังก์ชันจากคลาสพาเรนต์และคลาสลูกหลายคลาสของคลาสพาเรนต์ เนื่องจากการสืบทอดหลายเส้นทางขึ้นอยู่กับการสืบทอดหลายรายการ Java จึงไม่รองรับการใช้งาน
เหตุใด Java จึงไม่รองรับการสืบทอดหลายรายการ
ปัญหาหลักของการสืบทอดหลายรายการคือสามารถสร้างความคลุมเครือในคลาสย่อยได้ ในเอกสารไวท์เปเปอร์ปี 1995 หัวหน้านักออกแบบ Java James Gosling ระบุว่าปัญหาเกี่ยวกับการสืบทอดหลายรายการเป็นสาเหตุหนึ่งที่ Java ถูกสร้างขึ้น ความซับซ้อนที่มีอยู่ในมรดกหลายรายการจะเห็นได้ชัดเจนที่สุดในปัญหาเพชร ในปัญหาเพชร คลาสแม่ A มีคลาสลูกที่แตกต่างกันสองคลาส B และ C; นั่นคือคลาสลูก B และ C ขยายคลาส A ตอนนี้เราสร้างคลาสลูกใหม่ D ที่ขยายทั้งคลาส B และคลาส C โปรดทราบว่าเรามีการสืบทอดหลายรายการ (D ขยาย B และ C) การสืบทอดแบบลำดับชั้น ( B และ C ขยาย A) และมรดกหลายระดับ (D ขยาย A, B และ C) ในปัญหาไดมอนด์ คลาสลูก B และ C สืบทอดวิธีการจากคลาสแม่ A ทั้ง B และ C จะแทนที่วิธีที่สืบทอดมา แต่วิธีการใหม่ใน B และ C ขัดแย้งกัน คลาสลูกสุดท้าย D สืบทอดวิธีการสองวิธีที่เป็นอิสระและขัดแย้งกันจากผู้ปกครองหลายคน B และ C ยังไม่ชัดเจนว่าควรใช้วิธีใดของคลาส D ดังนั้นจึงเกิดความคลุมเครือ ภาษาการเขียนโปรแกรม OOP อื่นๆ ใช้วิธีการที่แตกต่างกันในการแก้ไขความคลุมเครือของการสืบทอดหลายรายการวิธีแก้ปัญหาการสืบทอดหลายรายการใน Java
การที่การสืบทอดหลายรายการเป็นปัญหาไม่ได้หมายความว่าจะไม่มีประโยชน์ มีหลายสถานการณ์ที่คุณอาจต้องการให้คลาสหนึ่งมีฟังก์ชันจากคลาสอื่นหลายคลาส ลองนึกถึง Tesla Roadster ที่คุณจะซื้อเมื่อคุณเป็นนักพัฒนาซอฟต์แวร์ที่ประสบความสำเร็จอย่างมาก คุณลักษณะทางเทคนิคขึ้นอยู่กับทั้งประเภทรถสปอร์ตและประเภทรถยนต์ไฟฟ้า อีกตัวอย่างหนึ่ง: เบราว์เซอร์ที่คุณกำลังอ่านบทความนี้ มีคุณลักษณะจากคลาสโซลูชันความเป็นส่วนตัวทางอินเทอร์เน็ตและจากคลาสอินเทอร์เน็ตเบราว์เซอร์ทั่วไป แต่คุณไม่สามารถขยายหลายคลาสใน Java ได้ แล้วภาษานี้จัดการกับปัญหาการสืบทอดหลายรายการอย่างไร? Java ใช้โครงสร้างที่เรียกว่าอินเทอร์เฟซ อินเทอร์เฟซเป็นประเภทนามธรรมที่กำหนดพฤติกรรมที่จะนำไปใช้โดยคลาส เนื่องจากเป็นนามธรรม อินเทอร์เฟซจึงไม่มีคำแนะนำโดยละเอียดเกี่ยวกับลักษณะการทำงาน แต่คลาสกลับจัดให้มีการใช้งานพฤติกรรมอินเทอร์เฟซอย่างเป็นรูปธรรม อินเทอร์เฟซมีลักษณะการกำหนดหลายประการ:- คุณไม่ได้สร้างอินสแตนซ์ให้กับอินเทอร์เฟซต่างจากคลาส แต่คลาสจะใช้อินเทอร์เฟซแทน
- อินเทอร์เฟซประกอบด้วยคำจำกัดความคงที่สาธารณะและส่วนหัวของวิธีการเท่านั้น
- อินเทอร์เฟซสามารถขยายอินเทอร์เฟซอื่นได้เท่านั้น ไม่สามารถขยายคลาสได้
- อินเทอร์เฟซสามารถขยายได้หลายอินเทอร์เฟซ และคลาสสามารถใช้หลายอินเทอร์เฟซได้
GO TO FULL VERSION