Mixins vs. Traits


คำตอบ:


214
  1. มิกซ์อินอาจมีลักษณะของรัฐ (ดั้งเดิม) ไม่
  2. Mixins ใช้ "การแก้ไขข้อขัดแย้งโดยนัย", ลักษณะใช้ "การแก้ไขข้อขัดแย้งอย่างชัดเจน"
  3. Mixins ขึ้นอยู่กับการทำให้เป็นเส้นตรงลักษณะจะแบน

บรรยายเกี่ยวกับลักษณะ

โฆษณา 1. ในมิกซ์อินคุณสามารถกำหนดตัวแปรอินสแตนซ์ ลักษณะที่ไม่อนุญาตให้ทำเช่นนี้ ต้องจัดเตรียมสถานะโดยการเขียนคลาส (= คลาสโดยใช้คุณลักษณะ)

โฆษณา 2. อาจมีความขัดแย้งของชื่อ สอง mixins ( MAและMB) หรือลักษณะ ( TAและTB) foo():voidกำหนดวิธีการที่มีความหมายเดียวกัน

Mixin MA {
    foo():void {
        print 'hello'
    }
}

Mixin MB {
    foo():void {
        print 'bye'
    }
}

Trait TA {
    foo():void {
        print 'hello'
    }
}

Trait TB {
    foo():void {
        print 'bye'
    }
}

ใน mixins ความขัดแย้งในการแต่งชั้นเรียนC mixins MA, MB จะได้รับการแก้ไขโดยปริยาย

Class C mixins MA, MB {
    bar():void {
        foo();
    }
}

สิ่งนี้จะโทรfoo():voidจากMA

ในขณะที่ใช้คุณลักษณะการแต่งคลาสจะต้องแก้ไขข้อขัดแย้ง

Class C mixins TA, TB {
    bar():void {
        foo();
    }
}

รหัสนี้จะเพิ่มความขัดแย้ง (สองคำจำกัดความของfoo():void)

โฆษณา 3 ความหมายของวิธีการไม่ได้ขึ้นอยู่กับว่ามันถูกกำหนดในลักษณะหรือในชั้นเรียนที่ใช้ลักษณะ

กล่าวอีกนัยหนึ่งมันไม่สำคัญว่าเมื่อใดที่ชั้นเรียนประกอบด้วยลักษณะหรือรหัสลักษณะคือ "คัดลอก - วาง" ลงในชั้นเรียน


5
ฉันรู้ว่ามันเป็นปีที่ผ่านมา แต่สำหรับผู้อ่านในอนาคตในทับทิมมันจะใช้วิธีการในรูปแบบโมดูลสุดท้ายที่ผสมในดังนั้นจึงจะเรียกว่า foo () ในรูปแบบ MB
rik.vanmechelen

4
ในลักษณะของสกาล่าสามารถมีฟิลด์ได้นี่หมายความว่าพวกเขาไม่ใช่ลักษณะ "ดั้งเดิม"?
Sergio

4
ใช่สิ่งเหล่านี้ไม่ใช่ "ดั้งเดิม" พวกเขาถูกเรียกว่าลักษณะ "statefull" ความแตกต่างระหว่างคุณสมบัติของรัฐและ
มิกซ์อิน

7
ไม่แน่นอน -1; วิธีที่คำว่า 'ลักษณะ' และ 'มิกซ์' ใช้ในป่านั้นไม่สอดคล้องกันอย่างมากและอย่างน้อยหนึ่งในจุดที่นี่ส่วนใหญ่ผิด PHP และ Wikipedia (และจาก @Sergio, Scala) ไม่เห็นด้วยกับคุณเกี่ยวกับลักษณะที่ไร้สัญชาติ ฉันไม่พบคำตอบนี้มีประโยชน์เพราะมันประกอบด้วยคำยืนยันที่เปลือยเปล่าและไม่มีความชัดเจนสำหรับฉันว่านี่เป็นอะไรที่มากกว่าวิธีที่คุณใช้คำเหล่านี้โดยส่วนตัว เพื่อให้มั่นใจว่าเป็นอย่างอื่นฉันจะต้องเห็นตัวอย่างมากมายเกี่ยวกับวิธีการใช้ข้อกำหนดในโลกแห่งความเป็นจริง (เช่นในภาษาการเขียนโปรแกรมจริง) เพื่อสำรองการอ้างสิทธิ์ของคุณ
Mark Amery

3
@AykutKllic Linearization -> "คอมไพเลอร์แก้ไขปัญหาของสิ่งที่เป็นซุปเปอร์โดยไม่ต้องมีความกำกวม" ( ibm.com/developerworks/library/j-jn8 )
เบน

9

หน้าเหล่านี้อธิบายความแตกต่างในภาษา D Programming

http://dlang.org/mixin.html

http://dlang.org/traits.html

มิกซ์อินในบริบทนี้เป็นโค้ดที่สร้างขึ้นทันทีและแทรกที่จุดนั้นในโค้ดระหว่างการคอมไพล์ ค่อนข้างมีประโยชน์สำหรับ DSL อย่างง่าย

ลักษณะเป็นค่าภายนอกเวลารวบรวม (แทนที่จะเป็นรหัสที่สร้างขึ้นจากแหล่งภายนอก) ความแตกต่างนั้นลึกซึ้ง มิกซ์อินเพิ่มตรรกะลักษณะเพิ่มข้อมูลเช่นข้อมูลประเภทเวลารวบรวม

ไม่รู้อะไรเกี่ยวกับทับทิมมากนัก แต่หวังว่ามันจะช่วยได้บ้าง


41
Mixins and Traits in D แตกต่างอย่างสิ้นเชิงจากความหมายของคำศัพท์ทางวิทยาศาสตร์คอมพิวเตอร์โดยทั่วไป ใน D ทั้งคู่เป็นตัวประมวลผลล่วงหน้าสำหรับการสร้างรหัสอัตโนมัติ ในภาษาอื่น ๆ พวกเขาเป็นกลไกการสืบทอด การตัดสินใจตั้งชื่อใน D นั้นโชคไม่ดี
tylerl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.