211. sealed classes

כאשר אנחנו כותבים מחלקות משלנו, באפשרותנו להפוך אותן להיות sealed, כלומר אטומות.

מחלקה שהיא sealed היא מחלקה שלא ניתן לרשת ממנה ולכן לא ניתן להרחיב אותה.

כדי להפוך מחלקה לsealed פשוט נשים את הKeyword ששמו sealed בהגדרה שלה:

1
public sealed class MyClass

היתרונות בלהפוך מחלקה לsealed:

  1. יכול להיות שיש לנו מחלקה שאנחנו לא באמת רוצים לחשוף החוצה, היא די פנימית. עכשיו במקרה היא public וגם לא sealed. מה שקורה אחרי זה, זה שאנחנו מגלים שמישהו ירש מהמחלקה שלנו ודרס כמה פונקציות, כאשר הוא לא היה אמור באמת להרחיב את המחלקה.
  2. במידה וקורה מה שמתואר בסעיף הקודם, ייתכן ועכשיו צריך לדאוג לתמוך לאחור בAPI ישן (למשל, חתימות של פונקציות שהן protected) כיוון שלא חשבנו על האפשרות שמישהו ירש מהמחלקה שלנו.
  3. קריאה לפונקציה וירטואלית שנדרסת ע"י מחלקה שהיא sealed (ע"י החזקת Reference מסוג מחלקה זו) גורמת לאופטימיזציה בJIT בקריאה לפקודת callvirt, מאחר ואין צורך לבדוק לאיזה פונקציה התכוון המתכנת לקרוא.
  4. בריצה באמצעות לולאת foreach יש לנו יותר Type-safety במחלקות שהן sealed (ראו גם טיפ מספר 52)

שימו לב שמחלקות סטטיות לא יכולות "sealed" מאחר ואין בהן מתודות וירטאליות שניתן לדרוס:

1
2
3
public sealed static class MyStaticClass
{
}

Error: ‘MyStaticClass’: a class cannot be both static and sealed

מצד שני, לעולם לא ניתן להרחיבן:

1
2
3
4
5
6
7
public static class MyStaticClass
{
}
public static class MyOtherStaticClass : MyStaticClass
{
}

Error: Static class ‘MyOtherStaticClass’ cannot derive from type ‘MyStaticClass’. Static classes must derive from object.

כך שהן סוג של "sealed"…

שבוע לא סגור טוב

שתף