תכנות מונחה עצמים (OOP) - הייחוס this

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

הייחוס this this


 
מאת: ארז קלר

כל אובייקט מכיל העתק פרטי של התכונות שלו במיקום שונה בזיכרון, מה שכמובן נראה טבעי והגיוני, כי
אחרת לא ניתן היה להגדיר ערכים אחרים לתכונות של אובייקטים, אולם המתודות משותפות לכל האובייקטים מאותה המחלקה.
למרות שלא נוצר העתק של המתודות עבור כל אובייקט מהמחלקה, יודעת המתודה בדיוק איזה אובייקט הפעיל אותה, וזאת למרות שמימוש המתודה לא מכיל שום התייחסות מפורשת לאותה המתודה.
לדוגמה:
e1.Print();
e2.Print();
 
המתודה ()Print תדפיס את המידע של e1 כאשר האובייקט e1 יפעיל אותה , ואת הפרטים של e2 כאשר האובייקט e2 יפעיל אותה , בשני המקרים מופעלת אותה המתודה בדיוק. כיצד הדבר מתרחש?, כיצד המתודה יודעת באמצעות איזה אובייקט היא הופעלה?
כאשר קוראים למתודה, הקומפיילר מוסיף לרשימת הפרמטרים של המתודה פרמטר חשוב נוסף, הפרמטר הנוסף הנו ייחוס לאובייקט שהפעיל את המתודה, הייחוס נשלח למתודה בצורה מרומזת (Implicit), במקרה הראשון כאשר המתודה ()Print תופעל, היא תקבל פרמטר יחיד המכיל את הכתובת של האובייקט e1 ובפעם השנייה אותה המתודה  ()Print תקבל את הכתובת של האובייקט e2 .
הייחוס נקרא this, הוא מתווסף אוטומטית לכל המתודות (למעט למתודות סטאטיות) ואם נרצה ונמצא זאת לנכון נוכל אף להשתמש בו.
המילה this הנה מילה שמורה.
לעיתים נהיה חייבים להתייחס בתוך גוף המתודה לאובייקט שהפעיל אותה.
לדוגמה: נניח שהמתודה הבאה הנה מתודה של Employee.
 
public  void SetEmployeeName(string   first_name)
}
      first_name = first_name;       
}

 

המתודה מקבלת פרמטר בשם first_name , שמו הפרטי של העובד, ומשימה אותו לתכונה הנקראת בשם זהה.
ברור שהדוגמה אינה ברת ביצוע, הרי המהדר (Compiler) לעולם לא יוכל להבחין בין הפרמטר first_name לתכונה first_name, כיצד הוא יוכל לדעת למה התכוונו שהקלדנו first_name ?
לצורך כך , C# מאפשרת לנו להשתמש באופרטור this.
ניתן להשתמש בייחוס this בכל פעם שנתייחס לרכיב של האובייקט ובמקרים מסוימים אף נהיה חייבים להשתמש בו.
בדוגמה SetEmployeeName נהיה חייבים להשתמש ב- this, על מנת להבחין בין הפרמטר לתכונה הנושאת שם זהה.

 
public void SetEmployeeName(string first_name)
}
     this.first_name = first_name;       
}

 

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