שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2019 - פולימורפיזם
איזה עקרון מבין הבאים קשור למצבים בהם הקומפיילר של ג'אווה לא יכול לדעת מה הטיפוס הדינאמי של משתנה (variable) מסוים?
1. קישור סטטי (static binding/devirtualization)
2. הפעלה דינאמית (dynamic dispatch)
3. פולימורפיזם (polymorphism)
4. האצלה (delegation)
1. קישור סטטי (static binding/devirtualization)
2. הפעלה דינאמית (dynamic dispatch)
3. פולימורפיזם (polymorphism)
4. האצלה (delegation)
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א2019סמסטר ב
★★★★★
פולימורפיזםOverriding
חשבו על ההבדל בין הטיפוס המוצהר של המשתנה (שידוע לקומפיילר) לבין הטיפוס של האובייקט בפועל בזמן ריצה.
התשובה הנכונה היא 2. הפעלה דינאמית (dynamic dispatch).
בג'אווה, לכל משתנה יש טיפוס סטטי (static type), שהוא הטיפוס המוצהר של המשתנה בקוד (למשל,
בזמן ריצה, המשתנה מצביע על אובייקט ספציפי, שלו יש טיפוס דינאמי (dynamic type), שהוא הטיפוס של האובייקט שנוצר בפועל (למשל,
כאשר מתבצעת קריאה למתודה על המשתנה (למשל,
הפעלה דינאמית היא המנגנון שבו ההחלטה איזו מתודה ספציפית להפעיל נדחית לזמן ריצה. המכונה הווירטואלית של ג'אווה (JVM) בודקת את הטיפוס הדינאמי של האובייקט, ומפעילה את המימוש המתאים של המתודה ששייך לאותו טיפוס. מנגנון זה הוא הבסיס למימוש פולימורפיזם באמצעות דריסת מתודות (Overriding).
מדוע האפשרויות האחרות אינן נכונות:
1. קישור סטטי (static binding): זהו המצב ההפוך, בו הקומפיילר *כן יודע* איזו מתודה להפעיל כבר בזמן קומפילציה. זה קורה עבור מתודות שהן
3. פולימורפיזם (polymorphism): זהו העיקרון הכללי והרחב יותר המאפשר למשתנה מטיפוס-על להצביע על אובייקט מטיפוס-תחתון. הפעלה דינאמית היא *המנגנון* הספציפי שמממש את ההתנהגות הפולימורפית בקריאה למתודות. לכן, 'הפעלה דינאמית' היא התשובה המדויקת יותר לשאלה על המנגנון הקשור לחוסר הידיעה של הקומפיילר.
4. האצלה (delegation): זוהי תבנית עיצוב (design pattern) ולא מנגנון ליבה של השפה. בתבנית זו, אובייקט אחד מעביר אחריות לביצוע משימה לאובייקט אחר. אין קשר ישיר לאופן שבו הקומפיילר וסביבת הריצה מפעילים מתודות.
בג'אווה, לכל משתנה יש טיפוס סטטי (static type), שהוא הטיפוס המוצהר של המשתנה בקוד (למשל,
List list). הקומפיילר, בזמן הקומפילציה, מכיר רק את הטיפוס הסטטי.בזמן ריצה, המשתנה מצביע על אובייקט ספציפי, שלו יש טיפוס דינאמי (dynamic type), שהוא הטיפוס של האובייקט שנוצר בפועל (למשל,
new ArrayList()). הטיפוס הדינאמי חייב להיות תואם לטיפוס הסטטי (כלומר, להיות זהה לו או תת-טיפוס שלו).כאשר מתבצעת קריאה למתודה על המשתנה (למשל,
list.add(...)), הקומפיילר מאמת שהמתודה קיימת בטיפוס הסטטי, אך הוא לא יכול לדעת בוודאות איזה מימוש ספציפי של המתודה יופעל. למשל, האם יופעל המימוש של ArrayList או של LinkedList? ההחלטה תלויה באובייקט שיוחזק במשתנה בזמן הריצה.הפעלה דינאמית היא המנגנון שבו ההחלטה איזו מתודה ספציפית להפעיל נדחית לזמן ריצה. המכונה הווירטואלית של ג'אווה (JVM) בודקת את הטיפוס הדינאמי של האובייקט, ומפעילה את המימוש המתאים של המתודה ששייך לאותו טיפוס. מנגנון זה הוא הבסיס למימוש פולימורפיזם באמצעות דריסת מתודות (Overriding).
מדוע האפשרויות האחרות אינן נכונות:
1. קישור סטטי (static binding): זהו המצב ההפוך, בו הקומפיילר *כן יודע* איזו מתודה להפעיל כבר בזמן קומפילציה. זה קורה עבור מתודות שהן
static, final או private.3. פולימורפיזם (polymorphism): זהו העיקרון הכללי והרחב יותר המאפשר למשתנה מטיפוס-על להצביע על אובייקט מטיפוס-תחתון. הפעלה דינאמית היא *המנגנון* הספציפי שמממש את ההתנהגות הפולימורפית בקריאה למתודות. לכן, 'הפעלה דינאמית' היא התשובה המדויקת יותר לשאלה על המנגנון הקשור לחוסר הידיעה של הקומפיילר.
4. האצלה (delegation): זוהי תבנית עיצוב (design pattern) ולא מנגנון ליבה של השפה. בתבנית זו, אובייקט אחד מעביר אחריות לביצוע משימה לאובייקט אחר. אין קשר ישיר לאופן שבו הקומפיילר וסביבת הריצה מפעילים מתודות.