שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2023 - מעקב אחר קוד

(Printer) נתון כי קוד שתי מחלקות הג'אווה למטה, שבראשונה מהן שורת קוד חסרה מוחלפת בסימני שאלה, מתקמפל ורץ ללא שגיאות.

נתון לנו גם כי p מצביע לעצם מטיפוס Printer או LaserPrinter.


מה מבין הבאים יכול ה-main להדפיס?




.1 הוא יכול להדפיס Laser Restart Printer
.2 הוא יכול להדפיס Laser Laser

.3 הוא יכול להדפיס Printer Restart Printer

.4 הוא יכול להדפיס Laser Restart Laser
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד ב2023סמסטר ב
מעקב אחר קודמחלקותירושהפולימורפיזםהסתרת מידעOverriding
שימו לב שהמתודה print היא private בשתי המחלקות. חשבו מהו הטיפוס המוצהר של המשתנה p שמאפשר לקוד להתקמפל, וכיצד עובד קישור (binding) עבור מתודות פרטיות לעומת מתודות פומביות.
התשובה הנכונה היא 3.

ניתוח והסבר:


1. הטיפוס המוצהר של `p`: הקוד צריך להתקמפל ללא שגיאות. הקריאה p.print() מתבצעת מתוך המתודה main של המחלקה Printer. המתודות print בשתי המחלקות הן `private`. המשמעות היא שהן נגישות רק מתוך המחלקה שבה הן מוגדרות. אם הטיפוס המוצהר של p היה LaserPrinter, הקריאה p.print() לא הייתה מתקמפלת, כי המתודה print של LaserPrinter היא פרטית למחלקה זו ואינה נגישה למחלקה Printer. לכן, הטיפוס המוצהר של p חייב להיות Printer.


2. הקריאה `p.print()`: מכיוון שהטיפוס המוצהר של p הוא Printer והמתודה print היא private, מתבצע קישור סטטי (static binding) בזמן קומפילציה. המהדר קושר את הקריאה למתודה print() של המחלקה Printer. לכן, הביטוי הראשון שיודפס יהיה תמיד "Printer ".


3. תהליך אלימינציה: תוצאה זו פוסלת מיידית את אפשרויות 1, 2 ו-4, שכולן מתחילות בפלט "Laser".


4. מסקנה: האפשרות היחידה שנותרה היא אפשרות 3. לכן, גם אם המשך הפלט באפשרות זו אינו תואם למה שהיה מתקבל מהרצה מדויקת של הקוד (שהייתה מניבה "Printer Restart Laser" עבור Printer p = new LaserPrinter();), בתור שאלה אמריקאית, זו התשובה היחידה האפשרית.


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