www.doronamir.com

E-mail: doron@doronamir.com

 

 

מה זה מחלקה חתומה ?  -  Sealed Classes

 

Sealed Classes:  מחלקה שלא ניתן לרשת ממנה.

 

כאשר אנו יורשים ממחלקות יתכן ונגיע לטיפוס המגדיר עצם מוגמר כלומר אין צורך בהורשה נוספת

לדוגמה אם הייתה לנו מחלקה – כלי רכב ולאחר הורשה יצרנו את המחלקה הספציפית יותר – Jeep

 אפשר לייצר מחלקה ספציפית עוד יותר למשל מחלקה Jeep מדגם  BMW

ונניח כי אין בכוונתו להמשיך ולבצע גזירה ממחלקה זאת עבור טיפוסים שונים

לכן נחתום את מחלקה זאת ובכך נמנע מצב אפשרי של הורשה נוספת.

 

אפשרי גם לחתום מתודה Sealed Method : מתודה שביצעה דריסה של פונקציה אחרת אך היא עצמה אינה ניתנת עוד לדריסה.

הסבר : כאשר פונקציה מסויימת מוגדרת כ Virtual היא ניתנת לדריסה ע"י override במחלקה הנגזרת ובהמחלקה הנגזרת ממנה.

יתכן מצב כי נרצה לדרוס את הפונקציה רק במחלקה הנגזרת הראשונה ובמחלקה הגוזרת ממנה נרצה לחסום אפשרות זאת .

במקרה זה  נשתמש בפונקציה חתומה כלומר  המחלקה היורשת אינה רשאית לדרוס פונקציה זו.

 

בדוגמה הבאה ניתן לראות כי הפונקציה SayHello  שמוגדרת כ virtual במחלקת Person  נדרסת במחלקה היורשת

Child הליך זה חוקי ואינו מהווה שגיאה אך במחלקת Child נעלנו את הדריסה למחלקות הנורשות ממחלקת Child

כלומר ניסיון דריסה נוסף עבור המתודה SayHello כמתואר בדוגמה יעלה שגיאה כי לא ניתן לדרוס מתודה שהוגדרה

במחלקת הבסיס כ sealed למרות שבמקורה היא וירטואלית .

 

בהמשך הדוגמה ניתן לראות  גזירה של מחלקה המוגדרת כ sealed לכן גם במקרה זה תתקבל שגיאה.

 

לדוגמה : קוד המראה מצב שגוי של ניסיון דריסת  פונקציה חתומה והורשת מחלקה חתומה

using System;

 

namespace doronamir1

{

   

    class Person

    {

        public virtual void SayHello()

        {

            Console.WriteLine("Person Class");

        }

    }

 

    class Child:Person

    {

        public sealed override void SayHello()

        {

            Console.WriteLine("Child Class");

        }

    }

 

    class Grandchild:Child

    {

        public override void SayHello()

        {

            Console.WriteLine("Grandchild Class");     // ERROR

        }

    }

 

    sealed class BaseClass

    {

        public  void Method1()

        {

            Console.WriteLine("Method1");

        }

    }

 

    class DrivedClass:BaseClass   //  ERROR

    {

        public  void Method1()

        {

            Console.WriteLine("Method1");

        }

    }

 

   

}