תכנות מונחה עצמים (OOP) - הורשה - הרשאת גישה Protected

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

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

עיקרון הסתרת המידע שריר וקיים גם בהורשה,
מתודות של מחלקה נגזרת (Derived Class) אינן יכולות לגשת לחברים הפרטיים של מחלקת הבסיס (Base class).
לעיתים יקרה ונרצה שמחלקות נגזרות כן יוכלו לגשת לרכיבים הפנימיים של המחלקות הבסיסיות, הסיבה יכולה להיות הרצון לשפר ביצועים.
במקום שמתודות במחלקה הנגזרת ייגשו ישירות לתכונות של המחלקה הבסיסית,
גישה ישירה במקום קריאה למתודות מהירה יותר וחוסכת משאבים.
 #C כמו שאר השפות מונחות האובייקטים מגדירה הרשאת גישה (Access modifier) נוספת
על אלו שדנו בהן עד כה הנקראת protected .
חברי מחלקה המוגדרים כ- protected הנם חברים מוגנים.
הרשאת הגישה protected מאפשרת למחלקות הנגזרות גישה חופשית לחברים המוגנים (protected members) כאילו היו public , אולם חוסמת את הגישה לשאר מרכיבי האפליקציה , כאילו אותם חברים מוגנים הם פרטיים.
לדוגמה (ProtectedSample):


מחלקת הבסיס (Base):
 1  : class Base 
 2  : { 
 3  :     private int num1; 
 4  :     protected int num2; 
 5  :     public Base(int num1, int num2) 
 6  :     { 
 7  :         this.num1 = num1; 
 8  :         this.num2 = num2; 
 9  :     } 
 10 :     public void CalcAvg() 
 11 :     { 
 12 :         Console.WriteLine((num1 + num2) / 2); 
 13 :     } 
 14 :     public int Num1 
 15 :     { 
 16 :         get 
 17 :         { 
 18 :             return this.num1; 
 19 :         } 
 20 :         set 
 21 :         { 
 22 :             this.num1 = value; 
 23 :         } 
 24 :     } 
 25 :     public int Num2 
 26 :     { 
 27 :         get 
 28 :         { 
 29 :             return this.num2; 
 30 :         } 
 31 :         set 
 32 :         { 
 33 :             this.num2 = value; 
 34 :         } 
 35 :     } 
 36 : } 
בשורה 4 מוגדרת התכונה num1 כתכונה מוגנת (Protected), המשמעות היא שהיא חשופה למחלקות הנגזרות כאילו היתה תכונה ציבורית (Public).

המחלקה הנגזרת (Derived):
 1  : class Derived : Base 
 2  : { 
 3  :     private int num3; 
 4  :     private int num4; 
 5  :     public Derived(int num1, int num2, int num3, int num4) 
 6  :         : base(num1, num2) 
 7  :     { 
 8  :         this.num3 = num3; 
 9  :         this.num4 = num4; 
 10 :     } 
 11 :     public new void CalcAvg() 
 12 :     { 
 13 :         Console.WriteLine((Num1 + num2 + num3 + num4) / 4); 
 14 :     } 
 15 :     public int Num3 
 16 :     { 
 17 :         get 
 18 :         { 
 19 :             return this.num3; 
 20 :         } 
 21 :         set 
 22 :         { 
 23 :             this.num3 = value; 
 24 :         } 
 25 :     } 
 26 :     public int Num4 
 27 :     { 
 28 :         get 
 29 :         { 
 30 :             return this.num4; 
 31 :         } 
 32 :         set 
 33 :         { 
 34 :             this.num4 = value; 
 35 :         } 
 36 :     } 
 37 : } 

בשורה 13 ניתן לראות את התכונה המוגנת בפעולה:
Console.WriteLine((Num1 + num2 + num3 + num4) / 4);

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


Main:
 1  : class Program 
 2  : { 
 3  :     static void Main(string[] args) 
 4  :     { 
 5  :         Derived d = new Derived(2, 4, 6, 8); 
 6  :         d.CalcAvg(); 
 7  :         d.Num1 = 100; 
 8  :         d.Num2 = 200; 
 9  :         d.Num3 = 300; 
 10 :         d.Num4 = 400; 
 11 :         d.CalcAvg(); 
 12 :     } 
 13 : } 
ב-Main נוכל לגשת לתכונה Num2 רק דרך המאפיין Num2, משום שהמחלקה Program אינה יורשת את מחלקת Base ולכן עבורה (ועבור שאר המחלקות) num1 חסומה כאילו הוגדרה private.

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

לדוגמה:
Age הוא משתנה מחלקתי מוגן, באחד הדוחות מתגלה ש- Age מכיל 1234 , היכן מסתתרת הבעיה?
חסרונות של Protected

איזו מחלקה שינתה את ערכו של Age לערך הלא חוקי?
 

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