เมื่อเขาบอกว่าสกาล่าไม่สนับสนุนการสืบทอดหลายครั้งเขาก็หมายถึงการสืบทอดวิธีการใช้งานหลายครั้ง แน่นอนว่าคุณสามารถใช้หลายอินเตอร์เฟส / คุณสมบัติในชั้นเรียนและพวกเขายังสามารถกำหนดวิธีการเดียวกัน แต่คุณไม่ได้รับความขัดแย้งระหว่างการใช้งานที่แตกต่างกันเนื่องจากลักษณะเชิงเส้นเชิงเส้น
โดยทั่วไปถ้าคุณมีคลาสที่C1
มีเมธอดf()
และคลาสC2
ด้วยเมธอดf()
ดังนั้นการสืบทอดหลายครั้งหมายความว่าคุณสามารถสืบทอดการประยุกต์ใช้ทั้งสองf()
อย่าง สิ่งนี้สามารถนำไปสู่ปัญหาต่าง ๆ ซึ่งสกาล่าแก้ไขได้โดยให้คุณรับมรดกจากคลาสเดียวและในกรณีที่มีหลายลักษณะโดยเลือกการใช้งานหนึ่งอย่างตามลำดับของคุณลักษณะ
สำหรับNothing
สิ่งต่าง ๆ นั้นง่ายมากเพราะไม่มีสิ่งใดที่ไม่มีคุณสมบัติหรือวิธีการที่กำหนดไว้ ดังนั้นคุณไม่สามารถมีความขัดแย้งทางมรดก แต่ฉันคิดว่าสิ่งที่คุณประหลาดใจส่วนใหญ่มาจากความเข้าใจที่แตกต่างกันเกี่ยวกับการสืบทอดหลายแบบ
เมื่อคุณเข้าใจว่าการทำให้เป็นลักษณะเชิงเส้นตรงจะช่วยลดความคลุมเครือของการสืบทอดได้อย่างมีประสิทธิภาพและเราไม่ได้อ้างถึงการสืบทอดจากหลาย ๆ ลักษณะเป็นการสืบทอดหลายอันเนื่องจากสิ่งนั้นคุณควรจะปรับ
ในฐานะที่เป็นวิธีการตระหนักถึงสิ่งนี้: คอมไพเลอร์มีความรับผิดชอบในที่สุดนี้ ดูข้อมูลจำเพาะภาษาสกาล่าส่วนที่ 3.5.2 ซึ่งสอดคล้องกับคุณสมบัติอื่น ๆ ได้แก่ :
For every type constructor T (with any number of type parameters), scala.Nothing <: T <: scala.Any.
หรือในคำอื่น ๆ หากคุณต้องการใช้คอมไพเลอร์อย่างถูกต้องก็ต้องจัดการ Nothing
เป็นประเภทย่อยของทุกอย่างตามสเปค ด้วยเหตุผลที่ชัดเจนNothing
ไม่ได้ถูกกำหนดให้ขยายจากคลาสทั้งหมดที่โหลดเข้าสู่ระบบ แต่ความเกี่ยวข้องของการกำหนดNothing
เป็นชนิดย่อยจะถูก จำกัด ในทุกสถานที่ซึ่งการพิมพ์ย่อยนั้นมีความเกี่ยวข้อง
จุดสำคัญในที่นี้คือไม่มีตัวอย่างประเภทNothing
ดังนั้นการรักษาจะถูก จำกัด เฉพาะการตรวจสอบประเภทซึ่งทั้งหมดอยู่ในขอบเขตของคอมไพเลอร์