การป้องกันวิธีที่มีการสืบทอดและทำให้เป็นเสมือนใน C#
ในโลกของการเขียนโปรแกรมเชิงวัตถุ โดยเฉพาะใน C# รูปแบบพหูพจน์ (polymorphism) จะช่วยให้สามารถออกแบบคลาสได้อย่างยืดหยุ่น อย่างไรก็ตามมีสถานการณ์ที่คุณอาจต้องการ จำกัด พฤติกรรมบางอย่าง เช่น การป้องกันวิธีที่มีการสืบทอดและทำให้เป็นเสมือนจากการถูกทำให้ทับซ้อนในคลาสลูก บทความนี้จะช่วยคุณในการทำความเข้าใจแนวคิดนี้และแสดงให้คุณเห็นวิธีการบรรลุเป้าหมายของคุณอย่างมีประสิทธิภาพ
การทำความเข้าใจปัญหา
ลองนึกภาพว่าคุณมีคลาสฐาน A
ที่มีวิธีเสมือน Render
วิธีนี้ถูกทำให้ทับซ้อนในคลาส B
ซึ่งถูกสืบทอดโดยคลาส C
เมื่อคุณเรียกใช้วิธี Render
บนออบเจ็กต์ของคลาส C
มันจะทำการเรียกใช้วิธี SpecialRender
ที่นิยามใน C
พฤติกรรมนี้อาจไม่เป็นที่ต้องการเสมอไป โดยเฉพาะเมื่อคุณต้องการให้ความสมบูรณ์ของโครงสร้างคลาสของคุณเป็นไปอย่างที่ตั้งใจ คำถามหลักที่เกิดขึ้นคือ:
สามารถป้องกันคลาส C
จากการทำให้ทับซ้อนวิธี Render
ได้หรือไม่ โดยไม่ทำให้โค้ดที่มีอยู่เสียหาย?
วิธีการ: ใช้คีย์เวิร์ด sealed
วิธีการแก้ไขปัญหานี้อยู่ที่การใช้คีย์เวิร์ด sealed
ใน C# โดยการทำเครื่องหมายวิธีการเป็น sealed
คุณจะป้องกันไม่ให้คลาสที่สืบทอดจากคลาสนี้ทำการทับซ้อนวิธีการนั้นอีก นี่คือวิธีการทำให้สิ่งนี้เกิดขึ้นในโค้ดของคุณ:
การนำไปใช้แบบขั้นตอน
-
ปรับปรุงการกำหนดคลาส: เปลี่ยนวิธี
Render
ในคลาสB
เป็นsealed override
.public class A { public virtual void Render() { // การใช้งานการเรนเดอร์เริ่มต้น } } public class B : A { public sealed override void Render() // ปิดการทำทับซ้อนของวิธีนี้ { // เตรียมออบเจ็กต์สำหรับการเรนเดอร์ SpecialRender(); // ทำการทำความสะอาด } protected virtual void SpecialRender() { // การใช้งานพื้นฐานของ SpecialRender } } public class C : B { // ไม่สามารถทำทับซ้อน Render ได้ เนื่องจากมีการปิดการทำทับซ้อนในคลาส B protected override void SpecialRender() { // สิ่งที่น่าทำใน C } }
-
ทำความเข้าใจวิธีการทำงาน: โดยการทำให้วิธี
Render
ในคลาสB
เป็นแบบ sealed คุณจะป้องกันไม่ให้คลาสC
ทำการทับซ้อน ในขณะที่ยังอนุญาตให้C
ให้การทำงานของSpecialRender
ตามที่ต้องการได้
ประโยชน์ของการใช้วิธีการ sealed
- การบำรุงรักษาที่ดีขึ้น: โดยการป้องกันคลาสลูกจากการเปลี่ยนแปลงฟังก์ชันพื้นฐาน คุณสามารถมั่นใจได้ว่าฟังก์ชันการทำงานของคลาสฐานยังคงนั้นอยู่
- เจตนาที่ชัดเจน: ทำให้เจตนาของคุณชัดเจนต่อผู้พัฒนาคนอื่นเกี่ยวกับส่วนไหนของโครงสร้างคลาสของคุณที่เป็นการกำหนดไว้และไม่ควรมีการเปลี่ยนแปลง
- การเพิ่มประสิทธิภาพ: ในบางสถานการณ์ รันไทม์สามารถเพิ่มประสิทธิภาพวิธีการที่ถูกปิด (
sealed
), ซึ่งสามารถปรับปรุงประสิทธิภาพได้
สรุป
สรุปได้ว่า หากคุณต้องการ ป้องกันไม่ให้วิธีเสมือนที่มีการสืบทอดถูกทำให้ทับซ้อน ในคลาสลูก คีย์เวิร์ด sealed
คือพันธมิตรที่ดีที่สุดของคุณ โดยการใช้วิธีนี้ คุณจะรักษาโครงสร้างและความสมบูรณ์ของโครงสร้างคลาสของคุณโดยไม่ทำให้ฟังก์ชันการทำงานที่มีอยู่ลดลง
คุณสามารถทดลองกับโครงสร้างคลาสของคุณใน C# และใช้พลังของพหูพจน์ พร้อมกับการควบคุมว่าต้องการให้วิธีไหนถูกปรับเปลี่ยน