שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2023 - מעקב אחר קוד
שאלה זו מתייחסת לקוד בנספח \[Lamp\]. נתון לנו כי
.1 ייתכן שיודפס
.2 ייתכן שיודפס
.3 ייתכן שיודפס
.4 ייתכן שיודפס
lamp מצביע למופע של אחת המחלקות הנתונות בנספח, אך לא נתון כיצד נבנה מופע זה (מה היו הארגומנטים לבנאי, האם הופעלו עליו פקודות לאחר יצירתו וכדומה). מה מהבאים יכול להיות מודפס ע"י הקוד הבא?.1 ייתכן שיודפס
Blue; on; Blue; MyLamp! off;.2 ייתכן שיודפס
on; MyLamp! off;.3 ייתכן שיודפס
Blue; on; MyLamp! MyLamp! off;.4 ייתכן שיודפס
MyLamp! onהעתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א2023סמסטר ב
★★★★★
מעקב אחר קודמחלקותאובייקטיםירושהOverridingפולימורפיזםקונסטרוקטור
שימו לב שהפלט מהקריאה ל-
turnOn מרמז על מצב מסוים של האובייקט, בעוד שהפלט מהקריאה ל-turnOff מרמז על מצב אחר. כיצד יכול אותו אובייקט להציג התנהגות התלויה במצבים שונים?התשובה הנכונה היא 3. ננתח מדוע הפלט
Blue; on; MyLamp! MyLamp! off; אפשרי. הפלט מורכב משתי קריאות לפונקציות על אותו אובייקט lamp. הקריאה הראשונה, lamp.turnOn(), מפיקה את הפלט Blue; on;. הקריאה השנייה, lamp.turnOff(), מפיקה את הפלט MyLamp! MyLamp! off;.\n\nהתופעה המעניינת היא שהקריאה הראשונה מרמזת שלמנורה יש צבע (Blue), והמתודה turnOn משתמשת בו. לעומת זאת, הקריאה השנייה לאותו אובייקט לא משתמשת בצבע זה. תופעה זו אפשרית אם למתודה turnOn יש תופעת לוואי (side effect): היא משנה את המצב הפנימי של האובייקט כך שהקריאה הבאה ל-turnOff תתנהג באופן שונה.\n\nלהלן דוגמה למבנה מחלקות המממש התנהגות זו:\n\n``java\nclass Lamp {\n public void turnOn() { System.out.print("on;"); }\n public void turnOff() { System.out.print("off;"); }\n}\n\nclass MyLamp extends Lamp {\n private String color;\n\n public MyLamp(String color) {\n this.color = color;\n }\n\n @Override\n public void turnOn() {\n if (this.color != null) {\n System.out.print(this.color + "; ");\n }\n super.turnOn();\n this.color = null; // תופעת לוואי: שינוי מצב האובייקט\n }\n\n @Override\n public void turnOff() {\n // מכיוון שהצבע אופס, התנאי הבא לא יתקיים\n if (this.color != null) {\n System.out.print(this.color + "; ");\n }\n System.out.print("MyLamp! ");\n System.out.print("MyLamp! ");\n super.turnOff();\n }\n}\n`\n\nכעת, נבצע **מעקב אחר הקוד** עם ההנחה ש-lamp הוא מופע של MyLamp שנוצר עם הצבע "Blue":\n1. Lamp lamp = new MyLamp("Blue");\n2. lamp.turnOn();\n - בזכות **פולימורפיזם**, נקראת המתודה turnOn של MyLamp.\n - המשתנה color הוא "Blue", לכן יודפס Blue; .\n - נקראת super.turnOn(), אשר מדפיסה on;.\n - המשתנה color מתעדכן ל-null.\n - הפלט עד כה: Blue; on;.\n3. lamp.turnOff();\n - נקראת המתודה turnOff של MyLamp.\n - המשתנה color הוא כעת null, לכן התנאי הראשון לא מתקיים והצבע לא יודפס.\n - יודפס MyLamp! פעמיים.\n - נקראת super.turnOff(), אשר מדפיסה off;.\n - פלט שלב זה: MyLamp! MyLamp! off;.\n\nהפלט הכולל הוא Blue; on; MyLamp! MyLamp! off;`, בדיוק כמו באפשרות 3. לכן, אפשרות זו ייתככן שתודפס. שאר האפשרויות פחות סבירות בהקשר של שאלה עם תשובה נכונה יחידה, מכיוון שלמשל ניתן לבנות היררכיית מחלקות אחת שתפיק גם את פלט 1 וגם את פלט 2 (כתלות בארגומנטים לבנאי), מה שהיה הופך את השאלה לדו-משמעית.