หากลักษณะขยาย B แล้วผสมในจะช่วยให้คุณได้อย่างแม่นยำ B บวกสิ่งที่จะเพิ่มหรือขยาย ในทางตรงกันข้ามหากลักษณะ A มีการอ้างอิงตัวเองซึ่งพิมพ์อย่างชัดเจนเป็น B ดังนั้นคลาสผู้ปกครองขั้นสุดท้ายจะต้องผสมใน B หรือประเภทลูกหลานของ B (และผสมในครั้งแรกซึ่งเป็นสิ่งสำคัญ)
นั่นคือความแตกต่างที่สำคัญที่สุด ในกรณีแรกประเภท B ที่แม่นยำจะตกผลึก ณ จุด A ที่ขยายออก ในครั้งที่สองผู้ออกแบบของระดับผู้ปกครองจะต้องตัดสินใจว่าจะใช้รุ่น B ใด ณ จุดที่ผู้ปกครองประกอบด้วยชั้น
ความแตกต่างก็คือที่ A และ B ให้วิธีการในชื่อเดียวกัน เมื่อ A ขยาย B วิธี A จะแทนที่ B's เมื่อ A ผสมกันหลังจาก B วิธีของ A ก็ชนะ
การอ้างอิงด้วยตนเองที่พิมพ์ออกมาจะช่วยให้คุณมีอิสระมากขึ้น การมีเพศสัมพันธ์ระหว่าง A และ B นั้นหลวม
UPDATE:
เนื่องจากคุณไม่ชัดเจนเกี่ยวกับประโยชน์ของความแตกต่างเหล่านี้ ...
หากคุณใช้การสืบทอดโดยตรงคุณจะสร้างลักษณะ A ซึ่งก็คือ B + A คุณได้ตั้งค่าความสัมพันธ์ในหิน
หากคุณใช้การอ้างอิงตนเองที่พิมพ์แล้วใครก็ตามที่ต้องการใช้คุณลักษณะ A ของคุณในคลาส C สามารถทำได้
- ผสม B แล้ว A เข้ากับ C
- ผสมชนิดย่อยของ B แล้ว A เป็น C
- ผสม A เป็น C โดยที่ C คือคลาสย่อยของ B
และนี่ไม่ใช่ข้อ จำกัด ของตัวเลือกของพวกเขาเนื่องจากวิธีที่สกาล่าช่วยให้คุณสามารถสร้างคุณลักษณะได้โดยตรงด้วยการบล็อกโค้ดเป็นตัวสร้าง
สำหรับความแตกต่างระหว่างวิธีการของ A ที่ชนะเนื่องจาก A ถูกนำมาผสมกันในที่สุดเมื่อเทียบกับ A ที่ขยายออก B ลองพิจารณาสิ่งนี้ ...
เมื่อคุณผสมในลำดับของลักษณะเมื่อใดก็ตามที่foo()
มีการเรียกใช้เมธอดคอมไพเลอร์จะไปที่ลักษณะสุดท้ายที่รวมกันเพื่อค้นหาfoo()
จากนั้น (หากไม่พบ) มันจะข้ามลำดับไปทางซ้ายจนกระทั่งพบลักษณะที่ใช้foo()
และใช้งาน ที่. A ยังมีตัวเลือกในการโทรsuper.foo()
ซึ่งจะข้ามลำดับไปทางซ้ายจนกระทั่งพบการใช้งานและอื่น ๆ
ดังนั้นถ้า A มีการอ้างอิงตัวเองพิมพ์ไปยัง B และผู้เขียนของ A รู้ว่า B ดำเนินการfoo()
, A สามารถโทรsuper.foo()
รู้ว่าถ้าไม่มีอะไรให้foo()
B จะ อย่างไรก็ตามผู้สร้างคลาส C มีตัวเลือกเพื่อวางลักษณะอื่น ๆ ที่ใช้foo()
และ A จะได้รับสิ่งนั้นแทน
อีกครั้งนี้จะมีประสิทธิภาพมากขึ้นและน้อยกว่าการ จำกัด การขยาย B โดยตรงและเรียกรุ่น B foo()
ของ