ดูเหมือนว่าแนวทางอย่างเป็นทางการของ Microsoft เกี่ยวกับการปิดผนึกมีการพัฒนาตั้งแต่คำถามนี้ถูกถามเมื่อประมาณ 9 ปีที่แล้วและพวกเขาได้ย้ายจากปรัชญาการเลือกใช้ (ประทับตราโดยค่าเริ่มต้น) เป็นเลือกไม่ใช้ (อย่าปิดผนึกโดยค่าเริ่มต้น):
X อย่าปิดผนึกชั้นเรียนโดยไม่มีเหตุผลที่ดีในการทำเช่นนั้น
การปิดผนึกชั้นเรียนเนื่องจากคุณไม่สามารถนึกถึงสถานการณ์การขยายได้นั้นไม่ใช่เหตุผลที่ดี ผู้ใช้เฟรมเวิร์กต้องการสืบทอดจากคลาสด้วยเหตุผลหลายประการที่ไม่ชัดเจนเช่นการเพิ่มสมาชิกอำนวยความสะดวก ดู Unsealed Classes สำหรับตัวอย่างเหตุผลที่ไม่ชัดเจนที่ผู้ใช้ต้องการสืบทอดจากประเภท
เหตุผลที่ดีในการปิดผนึกชั้นเรียนมีดังต่อไปนี้:
- คลาสเป็นคลาสแบบคงที่ ดูการออกแบบคลาสแบบคงที่
- คลาสนี้จัดเก็บความลับที่ไวต่อความปลอดภัยไว้ในสมาชิกที่ได้รับการป้องกันที่สืบทอด
- คลาสนี้สืบทอดสมาชิกเสมือนจำนวนมากและค่าใช้จ่ายในการปิดผนึกทีละคนจะมีมากกว่าประโยชน์ของการออกจากคลาสโดยไม่ปิดผนึก
- คลาสเป็นแอตทริบิวต์ที่ต้องการการค้นหารันไทม์ที่รวดเร็วมาก แอตทริบิวต์ที่ปิดผนึกมีระดับประสิทธิภาพที่สูงกว่าคุณสมบัติที่ปิดผนึกเล็กน้อย ดูคุณสมบัติ
X อย่าประกาศสมาชิกที่ได้รับการป้องกันหรือเสมือนในประเภทที่ปิดผนึก
ตามความหมายแล้วประเภทที่ปิดผนึกไม่สามารถสืบทอดมาได้ ซึ่งหมายความว่าไม่สามารถเรียกสมาชิกที่ได้รับการป้องกันในชนิดที่ปิดผนึกและไม่สามารถลบล้างเมธอดเสมือนบนชนิดปิดผนึก
✓พิจารณาสมาชิกการปิดผนึกที่คุณแทนที่ ปัญหาที่อาจเกิดจากการแนะนำสมาชิกเสมือน (กล่าวถึงใน Virtual Members) จะนำไปใช้กับการลบล้างเช่นกันแม้ว่าจะน้อยกว่าเล็กน้อยก็ตาม การปิดผนึกการแทนที่จะป้องกันคุณจากปัญหาเหล่านี้โดยเริ่มจากจุดนั้นในลำดับชั้นการสืบทอด
อันที่จริงหากคุณค้นหา ASP.Net Core codebaseคุณจะพบเพียง 30 ครั้งsealed class
เท่านั้นซึ่งส่วนใหญ่เป็นแอตทริบิวต์และคลาสทดสอบ
ฉันคิดว่าการอนุรักษ์ความไม่เปลี่ยนรูปเป็นข้อโต้แย้งที่ดีในการปิดผนึก