ลักษณะที่ปิดผนึกเป็นเช่นเดียวกับชั้นเรียนที่ปิดผนึก?
เท่าที่sealedไปใช่ พวกเขาแบ่งปันความแตกต่างปกติระหว่างtraitและclassแน่นอน
หรือถ้าไม่อะไรคือความแตกต่าง?
ดำริ
เป็นความคิดที่ดีที่จะใช้คุณลักษณะที่ปิดสนิทเมื่อใด (และเมื่อใด)
หากคุณมี a sealed class Xคุณต้องตรวจสอบXเช่นเดียวกับคลาสย่อยใด ๆ เช่นเดียวกับที่ไม่เป็นความจริงของหรือsealed abstract class X sealed trait Xดังนั้นคุณสามารถทำได้sealed abstract class Xแต่นั่นเป็นวิธีที่ verbose มากกว่าเพียงแค่traitและเพื่อประโยชน์น้อย
ข้อได้เปรียบหลักของการใช้แบบabstract classover a traitก็คือสามารถรับพารามิเตอร์ได้ ข้อได้เปรียบนั้นมีความเกี่ยวข้องโดยเฉพาะอย่างยิ่งเมื่อใช้คลาสประเภท สมมติว่าคุณต้องการสร้างต้นไม้เรียงตัวอย่างเช่น คุณสามารถเขียนสิ่งนี้:
sealed abstract class Tree[T : Ordering]
แต่คุณไม่สามารถทำสิ่งนี้:
sealed trait Tree[T : Ordering]
เนื่องจากขอบเขตบริบท (และขอบเขตการดู) ถูกนำไปใช้พร้อมกับพารามิเตอร์โดยนัย เนื่องจากคุณลักษณะนั้นไม่สามารถรับพารามิเตอร์ได้คุณจึงไม่สามารถทำเช่นนั้นได้
ส่วนตัวผมชอบและใช้มันจนกว่าเหตุผลบางอย่างโดยเฉพาะอย่างยิ่งทำให้ฉันใช้sealed trait sealed abstract classและฉันไม่ได้พูดถึงเหตุผลที่ละเอียดอ่อน แต่เหตุผลในหน้าของคุณคุณไม่สามารถเพิกเฉยได้เช่นการใช้คลาสประเภท