בכיתה
יום ב' (11.3.24)
1. קבלת תרגיל 'מחלקת Cake' עמ' 125-126.
יום ג' (12.3.24) - נדחה ליום ג' (19.3.24)
1. מבדק ש.ב: עמ' 124 "ארנונה בגרסה פולימורפית".
2. עבודה על תרגיל 'מחלקת Cake' עמ' 125-126.
יום ג' (19.3.24)
1. ההבדלים בין האופרטור == לפעולה Equals
כללי
- שניהם משמשים לבדיקה האם קיים שיוויון בין שני אובייקטים.
הפעולה Equals
- הפעולה Equals כתובה במחלקת השורש Object והיא מבצעת השוואה בין שני ייחוסים ב- Stack.
- זימון הפעולה Equals הנמצאת במחלקת השורש Object:
נניח שבמחלקת Student לא קיימת הפעולה override bool Equals, אזי
ההשוואה בין שני העצמים s1, s2 מסוג סטודנט (s1.Equals(s2 תהיה בין הייחוסים.
מדוע? כיוון שבפועל זומנה הפעולה Equals הנמצאת במחלקת השורש.
- זימון הפעולה Equals הנמצאת במחלקת Student:
נניח שבמחלקת Student קיימת הפעולה Equals, אזי ההשוואה בין שני הייחוסים s1, s2,
תהיה בהתאם לקוד הפעולה Equals כפי שהוא כתוב במחלקת Student.
האופרטור == (בין ייחוסים המפנים לעצמים)
- האופרטור == מבצע השוואה בין שני ייחוסים הנמצאים ב- Stack.
- נחדד: אין זה רלוונטי האם במחלקת Student שלנו קיימת הפעולה Equals ובין אם לאו.
האופרטור == מבצע תמיד השוואה בין הכתובות של שני הייחוסים.
- אם קיימים שני הייחוסים s1 ו- s2, אזי ההשוואה ביניהם s1 == s2 תחזיר תשובה בוליאנית
האם שני הייחוסים (הנמצאים בזיכרון ה- Stack) מפנים לאותו העצם (הנמצא ב- Heap).
האופרטור == (בין משתנים פרמיטיביים)
- האופרטור == מבצע השוואה בין שני ערכים הנמצאים ב- Stack.
- כאשר מדובר במשתנים פרמיטיביים (int, double, char, bool, string...), האופרטור ==
מבצע השוואה בין שני הערכים הקיימים במשתנים.
- שמו של המשתנה הפרמיטיבי וגם הערך המושם בו שוכנים בזיכרון ה- Stack.
למשל: int x = 5, שם המשתנה (x) נמצא ב- Stack וגם הערך המושם בו (5) נמצא ב- Stack.
- הערה: לא ניתן לבצע השוואה בין משתנים פרמיטיביים מסוגים השונים במהותם,
כמו למשל, השוואה בין משתנה מספרי למשתנה בוליאני, או השוואה בין משתנה מחרוזתי לתווי.
- דוגמה1 - השוואה בין שני משתנים פרמיטיביים מסוג int:
;int x = 5
;int y = 5
שני התנאים שלהלן מתקיימים, כיוון ששני הערכים זהים:
(if(x == y
((if(x.Equals(y
- דוגמה2 - השוואה בין שני משתנים פרמיטיביים מסוג string:
;"string str1 = "5drills
;"string str2 = "5drills
שני התנאים שלהלן מתקיימים, כיוון ששני הערכים זהים:
(if(str1 == str2
((if(str1.Equals(str2
2. משתנים סטטיים - אתחול וזמן טעינתם לזיכרון
- נניח שאנו מטפלים במחלקת Student שלנו:
- משתנה סטטי מוצהר באזור התכונות:
;private static count
- משתנה סטטי יאותחל בהכרח בפעולה מסוג בנאי סטטי:
static Student
}
;Student.count = 0
{
או
static Student
}
;count = 0
{
- משתנים סטטים הקיימים במחלקות השונות בתוכנית שלנו, נטענים לזיכרון וערכם
מאותחל על-ידי הבנאי הסטטי מיד עם הרצת התוכנית (Ctrl + F5) ועוד לפני הרצת
הפקודות הנמצאות בפעולה Main.
- גם אם לא יצרתי ב- Main עצמים מטיפוס Student, אוכל לכתוב את שורת הפקודה
;(Console.WriteLine(Student.count והפלט בעקבות שורה זו יהיה 0, בהתאם
לערך אתחול התכונה count כפי שנקבע בבנאי הסטטי של מחלקת Student.
3. הגדרת התכונה count כך שערכה משתנה בכל עת שנוצר עצם מטיפוס המחלקה
- הגדרנו במחלקת Student כי בכל עת שנוצר עצם מטיפוס המחלקה, ערך המשתנה
הסטטי count יעלה ב- 1.
- הסיבה לכך היא למשל במקרה שנרצה שערך תעודת הזהות של התלמיד ייקבע
באופן אוטומטי, כך שהעצם הראשון שייווצר מהמחלקה יהיה בעל תעודת זהות
שערכה הוא 1, העצם השני יקבל תעודת זהות שערכה 2 וכו'.
- סיבה נוספת להשתמש בתכונה הסטטית count היא שערכה מבטא את כמות
הסטודנטים שנוצרו עד כה בתכנית.
לבית (ל- 26.3.24)
1. התכוננו למבדק ש.ב בנושא תרגיל 'מחלקת Cake'.
* תרגיל זה לא קצר ומומלץ מאד לעבוד עליו כבר מעתה.
* מי שלא היה בשיעור ביום ג' - 12.3.24, ייבחן במבדק ש.ב על "ארנונה בגרסה פולימורפית".
בשיעור הבא
1. חדש - בנאי מאסטר ויצירת עצם חדש באמצעותו.
2. חדש - פעולה סטטית בתוך מחלקה, לשם מה?
3. חדש - פעולה פרטית בתוך מחלקה, לשם מה?
4. חזרה - האופרטור is ודריסה של פעולות במחלקות השייכות לאותה היררכיה.