שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2019 - מעקב אחר קוד
השאלה מתייחסת למחלקות הג'אווה המוגדרות בנספח בסעיף המסומן [ROBOT]. מה יודפס עבור הרצת קטע הקוד הבא?
1.
2.
3.
4. הקוד לא יתקמפל
1.
Hello!2.
Lalala!3.
Boogie!4. הקוד לא יתקמפל
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א2019סמסטר ב
★★★★★
מעקב אחר קודפולימורפיזםירושהcastingאובייקטיםמחלקות
הקומפיילר בודק את קריאות למתודות לפי הטיפוס המוצהר של המשתנה, לא לפי הטיפוס של האובייקט בזמן ריצה.
התשובה הנכונה היא 4. הקוד לא יתקמפל.
השורה
הבעיה מתעוררת בשורה
מכיוון שהמתודה
כדי שהקוד יתקמפל ויעבוד, היה צורך לבצע Casting (המרה) של המשתנה
השורה
SimpleRobot celin = new SingingRobot(); היא דוגמה לפולימורפיזם. המשתנה celin הוא מטיפוס SimpleRobot (מחלקת האב), אך הוא מצביע לאובייקט מטיפוס SingingRobot (היורשת). פעולה זו חוקית מכיוון שכל SingingRobot הוא גם SimpleRobot בזכות קשר הירושה.הבעיה מתעוררת בשורה
celin.sing();. בזמן קומפילציה, המהדר (compiler) בודק את חוקיות קריאות למתודות על סמך הטיפוס המוצהר של המשתנה, ולא על סמך הטיפוס של האובייקט שאליו הוא מצביע בפועל. במקרה זה, הטיפוס המוצהר של celin הוא SimpleRobot.מכיוון שהמתודה
sing() אינה מוגדרת במחלקה SimpleRobot (אלא רק במחלקת הבת SingingRobot), הקומפיילר לא מכיר אותה בהקשר של המשתנה celin. לכן, הוא יזרוק שגיאת קומפילציה, בדרך כלל משהו כמו "cannot find symbol" או "method sing() is undefined for the type SimpleRobot".כדי שהקוד יתקמפל ויעבוד, היה צורך לבצע Casting (המרה) של המשתנה
celin בחזרה לטיפוס SingingRobot:((SingingRobot) celin).sing();