תכנות מונחה עצמים (OOP) - פולימורפיזם - מתודות אבסטרקטיות

סגור באמצעות טופס זה תוכלו לספר ולהמליץ לחבריכם..
שם השולח:
כתובת דוא"ל של השולח:
שם המקבל:
שלח לכתובת דוא"ל:
הוסף הערה:
מתודה מופשטת הנה מתודה וירטואלית אשר אין לה מימוש במחלקה בה היא מוגדרת. מחלקה נגזרת היורשת מחלקה אבסטרקטית חייבת לממש את כל המתודות האבסטרקטיות המוגדרות במחלקת הבסיס.

  מתודות אבסטרקטיות
 
מאת: ארז קלר


דוגמת קודהורדת דוגמאות קוד 

מרגע שמחלקה הוגדרה כמחלקה מופשטת, ניתן להגדיר בה מתודות מופשטות (Abstract Methods).
מתודה מופשטת הנה מתודה וירטואלית אשר אין לה מימוש במחלקה בה היא מוגדרת.
מחלקה נגזרת היורשת מחלקה אבסטרקטית חייבת לממש את כל המתודות האבסטרקטיות המוגדרות במחלקת הבסיס.
במידה והמחלקה הנגזרת אינה מממשת את המתודות האבסטרקטיות שלה אשר הוגדרו במחלקת הבסיס תתקבל שגיאת קומפילציה. 

C# מאפשרת להגדיר גם מאפיינים מופשטים (Abstract Properties).
מתי נעדיף להגדיר מתודה אבסטרקטית על פני מתודה רגילה?
בכל מקרה בו אין צורך או אין היגיון לממש מתודה וירטואלית או מאפיין וירטואלי במחלקת הבסיס משום שאין למימוש שום משמעות נעדיף להגדיר את המתודה או את המאפיין כמופשטים.

תחביר:
abstract class Sample
{
            public abstract void FuncName();
            public abstract int Num
            {
                        get;
                        set;
            }
}

 

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


דוגמה (AbstractMethod):
מחלקת הבסיס:
 1  : abstract class Base 
 2  : { 
 3  :     protected int num; 
 4  :     public Base(int num) 
 5  :     { 
 6  :         this.num = num; 
 7  :     } 
 8  :     public abstract void PrintMsg(); 
 9  :     public abstract void Print(); 
 10 :     public abstract int Num 
 11 :     { 
 12 :         get; 
 13 :         set; 
 14 :     } 
 15 : } 
המחלקה Base מוגדרת כמחלקה אבסטרקטית (בשורה 1) ולכן ניתן להגדיר בה מתודות ומאפיינים אבסטרקטיים.
בשורה 8 ובשורה 9 מוגדרות המתודות האבסטרקטיות ()PrintMsg ו- ()Print, לא ניתן להגדיר להן מימוש, המימוש חייב להיות במחלקה הנגזרת. 

בשורה 10 מוגדר המאפיין אסטרקטי Num, גם לו אין מימוש וגם לו נהיה חייבים להגדיר מימוש במחלקה הנגזרת.
 
המחלקה הנגזרת:
 1  : class Derived : Base 
 2  : { 
 3  :     private string str; 
 4  :  
 5  :     public Derived(int num, string str) 
 6  :         : base(num) 
 7  :     { 
 8  :         this.str = str; 
 9  :     } 
 10 :     public override void PrintMsg() 
 11 :     { 
 12 :         Console.WriteLine("Stam Message 1"); 
 13 :     } 
 14 :  
 15 :     public override void Print() 
 16 :     { 
 17 :         Console.WriteLine("num = {0}", num); 
 18 :         Console.WriteLine("str = {0}", str); 
 19 :     } 
 20 :     public override int Num 
 21 :     { 
 22 :         get 
 23 :         { 
 24 :             return base.num; 
 25 :         } 
 26 :         set 
 27 :         { 
 28 :             base.num = value; 
 29 :         } 
 30 :     } 
 31 :     public string Str 
 32 :     { 
 33 :         get 
 34 :         { 
 35 :             return str; 
 36 :         } 
 37 :         set 
 38 :         { 
 39 :             str = value; 
 40 :         } 
 41 :     } 
 42 : } 
המחלקה Derived יורשת את מחלקת הבסיס Base (שורה 1), המחלקה Derived חייבת לממש את המתודות האבסטרקטיות ואת המאפיין האבסטרקטי שהוגדרו במחלקת הבסיס.
בשורה 10 נדרוס ונכתוב מימוש למתודה ()PrintMsg, בשורה 15 נדרוס ונכתוב מימוש למתודה ()Print,
ובשורה 20 נספק מימוש למאפיין Num.


Main:
 1  : class Program 
 2  : { 
 3  :     static void Main(string[] args) 
 4  :     { 
 5  :         Derived d = new Derived(3, "Metushlach"); 
 6  :         d.Print(); 
 7  :  
 8  :         d.PrintMsg(); 
 9  :         Base b = new Derived(10, "Bla Bla Bla"); 
 10 :         b.Print(); 
 11 :         b.PrintMsg(); 
 12 :     } 
 13 : } 

פלט:
פלט תוכנית הדוגמה AbstarctMethod

לעיתים קרובות אי מימוש מחדש של מתודה וירטואלית יגרור שגיאה לוגית, משום שבאופן אוטומטי יופעל המימוש של מחלקת הבסיס, בעוד שאי מימוש מתודה מופשטת היה גורר שגיאת קומפילציה, באופן זה על ידי שימוש במתודה מופשטת ניתן להמיר שגיאה לוגית פוטנציאלית (שקשה מאוד לאתרה ולתקנה), בשגיאת קומפילציה קלה לאיתור ותיקון.  



 



כל הזכויות שמורות למחבר ©