שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2019 - אובייקטים
(OCCUP) השאלה מתייחסת לקוד הג'אווה בנספח בסעיף המסומן [SITTER]. מה נכון לומר לגבי הקוד הבא?
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד ב2019סמסטר ב
★★★★★
אובייקטיםפולימורפיזםמעקב אחר קודמחלקות
שיטת ה-
sit של BullySitter מקבלת הפניה לאובייקט Chair ומשנה את המצב הפנימי שלו. חשבו מה תהיה ההשפעה של שינוי זה על הקריאה הבאה למתודה getSitter.ננתח את קטע הקוד שורה אחר שורה:
1.
2.
3.
לסיכום: קטע הקוד מדגים כיצד אובייקט (
1.
Chair c = new OccupiedChair();: שורה זו יוצרת אובייקט חדש מהמחלקה OccupiedChair ומציבה את ההפניה אליו במשתנה c מהטיפוס Chair. זהו שימוש בפולימורפיזם, حيث ניתן להתייחס לאובייקט מהמחלקה היורשת (OccupiedChair) כאילו הוא מהמחלקה האם (Chair).2.
(new BullySitter()).sit(c);: בשורה זו מתרחשים שני דברים. ראשית, נוצר אובייקט חדש ואנונימי מהמחלקה BullySitter. שנית, מיד לאחר יצירתו, נקראת עליו המתודה sit, וההפניה c (שמצביעה על אובייקט ה-OccupiedChair) מועברת אליה כארגומנט. בג'אווה, הפניות לאובייקטים מועברות by value, כלומר המתודה sit מקבלת העתק של ההפניה, אך העתק זה עדיין מצביע לאותו האובייקט בזיכרון. לכן, למתודה sit יש את היכולת לשנות את המצב הפנימי של אובייקט ה-Chair. סביר להניח שהמימוש של sit מבצע משהו כמו c.setSitter(this), ובכך משנה את השדה הפנימי של אובייקט הכיסא כך שיחזיק הפניה לאובייקט ה-BullySitter הנוכחי.3.
c.getSitter();: קריאה זו למתודה getSitter על האובייקט c תחזיר את הערך הנוכחי של שדה ה-"יושב" (sitter) שלו. מכיוון שהשורה הקודמת שינתה את מצב האובייקט וקבעה שה-BullySitter יושב על הכיסא, קריאה זו תחזיר הפניה לאותו אובייקט BullySitter שנוצר בשורה השנייה.לסיכום: קטע הקוד מדגים כיצד אובייקט (
BullySitter) יכול לשנות את מצבו של אובייקט אחר (Chair) המועבר אליו כפרמטר למתודה. הקריאה האחרונה, c.getSitter(), מאמתת את שינוי המצב הזה ומחזירה את ה-BullySitter שהתיישב על הכיסא. בהנחה שהמימושים של המחלקות סטנדרטיים ולא זורקים חריגות, הקוד ירוץ ללא שגיאות.