JavaRush /จาวาบล็อก /Random-TH /คอฟฟี่เบรค #95 วิธีแก้ปัญหาการสืบทอดหลายรายการใน Java

คอฟฟี่เบรค #95 วิธีแก้ปัญหาการสืบทอดหลายรายการใน Java

เผยแพร่ในกลุ่ม
ที่มา: FreeCodeCamp Java เป็นหนึ่งในภาษาการเขียนโปรแกรมเชิงวัตถุที่ได้รับความนิยมมากที่สุดภาษาหนึ่งที่ใช้อยู่ในปัจจุบัน เนื่องจากเป็นแพลตฟอร์มที่ไม่ขึ้นกับใคร คุณจึงสามารถค้นหาแอปพลิเคชัน Java ได้บนอุปกรณ์ทุกประเภทและทุกระบบปฏิบัติการ และเนื่องจาก Java ค่อนข้างเรียนรู้ได้ง่าย จึงเป็นหนึ่งในภาษาที่โปรแกรมเมอร์หลายคนเชี่ยวชาญ คุณสมบัติที่สำคัญของ Java ที่คุณควรทำความคุ้นเคยคือการสืบทอดคลาส การสืบทอดช่วยให้คุณเพิ่มประสิทธิภาพโค้ดของคุณ ทำให้ง่ายต่อการนำคลาสกลับมาใช้ใหม่ เมื่อคุณสามารถนำโค้ดที่ได้รับการทดสอบและดีบั๊กแล้วกลับมาใช้ใหม่ได้ วงจรการพัฒนาซอฟต์แวร์จะสั้นลงและมีราคาถูกลง คอฟฟี่เบรค #95  วิธีแก้ปัญหาการสืบทอดหลายรายการใน Java - 1แม้ว่าจะเป็นแนวคิดง่ายๆ ในทางทฤษฎี แต่ความสัมพันธ์ของการสืบทอดการเข้ารหัสจำเป็นต้องใส่ใจในรายละเอียด โดยเฉพาะอย่างยิ่งในส่วนที่เกี่ยวกับการรับมรดกหลายรายการ โดยที่คลาสย่อยหนึ่งคลาสสืบทอดคุณสมบัติจากคลาสพาเรนต์หลายคลาส Java ปฏิเสธความสัมพันธ์ที่สืบทอดหลายรายการเนื่องจากความสัมพันธ์เหล่านี้สร้างความกำกวม แต่มีหลายวิธีในการบรรลุผลเดียวกันหลายประการหากคุณรู้ว่าต้องทำอย่างไร ในบทความนี้ เราจะดูปัญหาเกี่ยวกับการสืบทอดหลายรายการ และหารือเกี่ยวกับตัวเลือกการเข้ารหัสทางเลือกใน Java

คำศัพท์เกี่ยวกับมรดก

บางครั้ง ในการเป็นโปรแกรมเมอร์ที่ประสบความสำเร็จ คุณต้องเป็นนักแก้ปัญหาเพื่อค้นหาวิธีแก้ไขข้อผิดพลาดหรือปัญหาทั่วไป นี่เป็นส่วนสำคัญของการเข้ารหัสที่ปลอดภัยและชาญฉลาด ปัญหาหนึ่งดังกล่าวเกี่ยวข้องกับการสืบทอดหลายรายการ (หรือมากกว่านั้นคือขาดไป) ใน Java คอฟฟี่เบรค #95  วิธีแก้ปัญหาการสืบทอดหลายรายการใน Java - 2เพื่อให้เข้าใจถึงการสืบทอดใน Java อย่างถ่องแท้ คุณจะต้องคุ้นเคยกับคำศัพท์เฉพาะของการสืบทอดพื้นฐานของการเขียนโปรแกรมเชิงวัตถุ (OOP)
  • คลาสเป็นโครงสร้างพื้นฐานของภาษาโปรแกรมเชิงวัตถุ คลาสกำหนดคุณสมบัติทั่วไปสำหรับกลุ่มของวัตถุ
  • คลาสผู้ปกครอง : เรียกอีกอย่างว่าคลาสพื้นฐานหรือคลาสขั้นสูง คลาสพาเรนต์เป็นคลาสที่ขยายได้ซึ่งมีฟังก์ชันการทำงานให้กับคลาสลูก ช่วยให้สามารถนำกลับมาใช้ใหม่ได้ คำจำกัดความและฟังก์ชันของคลาสพาเรนต์จะถูกนำมาใช้ซ้ำเมื่อสร้างคลาสลูก
  • คลาสย่อย : โดยทั่วไปเรียกว่าคลาสย่อย คลาสย่อยสืบทอดฟังก์ชันการทำงานจากคลาสอื่น คลาสย่อยเป็นคลาสแบบขยายหรือแบบสืบทอด
  • การสืบทอด : ความสัมพันธ์ระหว่างคลาสผู้ปกครองและคลาสลูก

ประเภทการสืบทอด OOP

มีภาษาการเขียนโปรแกรมเชิงวัตถุยอดนิยมมากมายที่ใช้อยู่ในปัจจุบัน รวมถึง Java, C++, JavaScript, Python, PHP, Ruby และ Perl แม้ว่าการสืบทอดจะเป็นแนวคิดทั่วไปในภาษา OOP เหล่านี้ แต่การสืบทอดบางประเภทมีอยู่ในแต่ละภาษาเหล่านี้ เป็นสิ่งสำคัญอย่างยิ่งที่จะต้องทราบประเภทมรดกทั่วไปและข้อจำกัดในการสืบทอดในภาษาเฉพาะที่คุณใช้ ยิ่งคุณรู้เกี่ยวกับการสืบทอดมากเท่าไร คุณก็จะยิ่งเป็นนักพัฒนาที่มีประสิทธิภาพมากขึ้นเท่านั้น ประเภทของมรดกที่ Java รองรับ ได้แก่ :
  • การสืบทอดระดับเดียว : เมื่อคลาสลูกสืบทอดคุณสมบัติจากคลาสพาเรนต์เดียว
  • การสืบทอดหลายระดับ : นี่คือรูปแบบการสืบทอดระดับเดียวหลายระดับ ในการสืบทอดหลายระดับ คลาสลูกยังสามารถทำหน้าที่เป็นคลาสพาเรนต์สำหรับคลาสลูกอื่นได้ ความสัมพันธ์ระหว่างแต่ละระดับเป็นแบบเส้นตรง - ไม่มีสาขาใดที่จะสูงไปกว่าการสืบทอดหลายรายการ ในกรณีนี้ คลาสย่อยสุดท้ายจะมีฟังก์ชันจากทุกระดับข้างต้น
  • การสืบทอดแบบลำดับชั้น : สิ่งที่ตรงกันข้ามกับการสืบทอดหลายแบบ ในการสืบทอดแบบลำดับชั้น คลาสพาเรนต์เดี่ยวมีคลาสลูกมากกว่าหนึ่งคลาส แทนที่จะมีกิ่งก้านอยู่เหนือ กลับแตกกิ่งก้านออกไปด้านล่าง
  • การสืบทอดแบบลูกผสม : ตามชื่อที่แนะนำ การสืบทอดแบบลูกผสมคือการรวมกันของการสืบทอดประเภทอื่น ๆ
นอกจากประเภทการสืบทอดที่ระบุไว้ข้างต้นแล้ว ยังมีประเภทอื่นๆ ที่ Java ไม่รองรับ
  • การสืบทอดหลายรายการ : ในการสืบทอดหลายรายการ คลาสลูกจะมีคลาสพาเรนต์มากกว่าหนึ่งคลาส แม้ว่า Java และ JavaScript จะไม่รองรับการสืบทอดหลายรายการ แต่ภาษา OOP เช่น C++ ก็รองรับได้
  • การสืบทอดแบบหลายเส้นทาง : ลูกผสมของการสืบทอดหลายระดับหลายระดับและแบบลำดับชั้น ในการสืบทอดแบบหลายเส้นทาง คลาสลูกจะสืบทอดคุณลักษณะและฟังก์ชันจากคลาสพาเรนต์และคลาสลูกหลายคลาสของคลาสพาเรนต์ เนื่องจากการสืบทอดหลายเส้นทางขึ้นอยู่กับการสืบทอดหลายรายการ Java จึงไม่รองรับการใช้งาน

เหตุใด Java จึงไม่รองรับการสืบทอดหลายรายการ

ปัญหาหลักของการสืบทอดหลายรายการคือสามารถสร้างความคลุมเครือในคลาสย่อยได้ ในเอกสารไวท์เปเปอร์ปี 1995 หัวหน้านักออกแบบ Java James Gosling ระบุว่าปัญหาเกี่ยวกับการสืบทอดหลายรายการเป็นสาเหตุหนึ่งที่ Java ถูกสร้างขึ้น ความซับซ้อนที่มีอยู่ในมรดกหลายรายการจะเห็นได้ชัดเจนที่สุดในปัญหาเพชร ในปัญหาเพชร คลาสแม่ A มีคลาสลูกที่แตกต่างกันสองคลาส B และ C; นั่นคือคลาสลูก B และ C ขยายคลาส A คอฟฟี่เบรค #95  วิธีแก้ปัญหาการสืบทอดหลายรายการใน Java - 3ตอนนี้เราสร้างคลาสลูกใหม่ 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 ใช้โครงสร้างที่เรียกว่าอินเทอร์เฟซ อินเทอร์เฟซเป็นประเภทนามธรรมที่กำหนดพฤติกรรมที่จะนำไปใช้โดยคลาส เนื่องจากเป็นนามธรรม อินเทอร์เฟซจึงไม่มีคำแนะนำโดยละเอียดเกี่ยวกับลักษณะการทำงาน แต่คลาสกลับจัดให้มีการใช้งานพฤติกรรมอินเทอร์เฟซอย่างเป็นรูปธรรม อินเทอร์เฟซมีลักษณะการกำหนดหลายประการ:
  • คุณไม่ได้สร้างอินสแตนซ์ให้กับอินเทอร์เฟซต่างจากคลาส แต่คลาสจะใช้อินเทอร์เฟซแทน
  • อินเทอร์เฟซประกอบด้วยคำจำกัดความคงที่สาธารณะและส่วนหัวของวิธีการเท่านั้น
  • อินเทอร์เฟซสามารถขยายอินเทอร์เฟซอื่นได้เท่านั้น ไม่สามารถขยายคลาสได้
  • อินเทอร์เฟซสามารถขยายได้หลายอินเทอร์เฟซ และคลาสสามารถใช้หลายอินเทอร์เฟซได้
ตอนนี้เราสามารถแก้ไขปัญหาเพชรได้อย่างมีประสิทธิภาพโดยใช้อินเทอร์เฟซ โปรดจำไว้ว่าอินเทอร์เฟซเท่านั้นที่สามารถขยายได้เฉพาะอินเทอร์เฟซอื่น ๆ และคลาสใด ๆ ที่ต้องการคุณสมบัติการสืบทอดหลายรายการต้องใช้หลายอินเทอร์เฟซ เราสามารถแทนที่คลาสปัญหาไดมอนด์ได้ สิ่งที่เคยเป็นคลาส A, B และ C ตอนนี้กลายเป็นอินเทอร์เฟซ A, B และ C อินเทอร์เฟซ B และ C ยังคงขยายอินเทอร์เฟซ A แต่ไม่มีอินเทอร์เฟซใดที่มีฟังก์ชันการทำงานเฉพาะ มีเพียงลักษณะการทำงานเฉพาะเท่านั้น คลาส D ยังคงเป็นคลาสที่รับผิดชอบในการใช้ลักษณะการทำงานที่พบในอินเทอร์เฟซ B และ C โดยเฉพาะ หมายเหตุข้อแตกต่างที่สำคัญอย่างหนึ่ง: คลาส D จะไม่ขยายอินเทอร์เฟซ B และ C แต่จะนำไปใช้แทน วิธีนี้จะทำให้คุณไม่มีมรดกหลายอันจริงๆ แต่คุณเพียงแค่ปรับกรอบปัญหาใหม่

บทสรุป

การทำความเข้าใจการสืบทอดถือเป็นสิ่งสำคัญสำหรับนักพัฒนา Java ที่มีประสิทธิภาพ สิ่งสำคัญไม่แพ้กันคือต้องทราบข้อจำกัดของการสืบทอดและวิธีแก้ปัญหาในตัวของ Java สำหรับปัญหาการสืบทอดหลายรายการแบบดั้งเดิม การเรียนรู้วิธีสร้างอินเทอร์เฟซเพื่อสร้างเอฟเฟกต์ของการสืบทอดหลายรายการใน Java จะช่วยปรับปรุงประสิทธิภาพการทำงานและโอกาสในการจ้างงานของคุณ
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION