שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2021 - Overloading
(compile) מתודה foo מציודה (בחתימה שלה) על עדר הרזחה מסוג Triangle. מה מבין הבאים איה הדרך בה הקומפיילר שומתשמש בתוך החוזה של m שב-Y לא אמור להיזרק חריג מהמתודה זה הדבר שהרלייפמוקה הקומפיילר שלנו?
1. אם מתודות מעמסות (overload) מתודה חוזה של foo ימינו החתימה foo(X(... )) בשורת הקוד, ניתן בחוזה לחוזה מעמסות קומפיילר יבחר זה הטוב ביותר הרזחה של קומפיילר סופי מ-Triangle, לשמל, Triangle
2. אם אין (overloading) מתודות מעמסות foo לשפא(add.list(... )), כל ריצה של foo לשמל היא list רשאכ list של הממשק הגנרי מלבד רטמרפ מטיפוס סופיטה (super type) של list לשמל Shape, לשמל, Triangle
3. בשורה קוד return t ב-foo קומפיילר יודע כי הטיפוס הסטטי של t הוא סופיט-תת של Triangle, לשמל, Triangle או EquilateralTriangle (subtype) של Triangle
4. אם מתודה אחרת דורסת (override) את foo, קומפיילר יודע כי טיפוס הרזחה של צוד הרזחה של המתודה דורסת היא סופיט-תת (subtype) סופיט של Triangle, לשמל, EquilateralTriangle או Triangle
1. אם מתודות מעמסות (overload) מתודה חוזה של foo ימינו החתימה foo(X(... )) בשורת הקוד, ניתן בחוזה לחוזה מעמסות קומפיילר יבחר זה הטוב ביותר הרזחה של קומפיילר סופי מ-Triangle, לשמל, Triangle
2. אם אין (overloading) מתודות מעמסות foo לשפא(add.list(... )), כל ריצה של foo לשמל היא list רשאכ list של הממשק הגנרי מלבד רטמרפ מטיפוס סופיטה (super type) של list לשמל Shape, לשמל, Triangle
3. בשורה קוד return t ב-foo קומפיילר יודע כי הטיפוס הסטטי של t הוא סופיט-תת של Triangle, לשמל, Triangle או EquilateralTriangle (subtype) של Triangle
4. אם מתודה אחרת דורסת (override) את foo, קומפיילר יודע כי טיפוס הרזחה של צוד הרזחה של המתודה דורסת היא סופיט-תת (subtype) סופיט של Triangle, לשמל, EquilateralTriangle או Triangle
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד ב2021סמסטר ב
★★★★★
OverloadingOverridingפולימורפיזםמעקב אחר קוד
חשבו איזה מהמנגנונים המוזכרים (overloading, overriding, טיפול בטיפוסים) מתרחש באופן מלא בזמן קומפילציה ומתבסס על הטיפוסים הסטטיים של המשתנים.
התשובה הנכונה היא 1.
השאלה, על אף ניסוחה הבעייתי, בוחנת את הבנת ההבדלים בין התנהגות הקומפיילר בזמן קומפילציה להתנהגות התוכנית בזמן ריצה, בהקשר של מושגי יסוד בתכנות מונחה עצמים.
1. נכון. בחירה בין מתודות מועמסות (overloading) מתבצעת בזמן קומפילציה, בתהליך שנקרא Overload Resolution. הקומפיילר מזהה את כל המתודות עם השם הנתון (
2. לא נכון. הניסוח של סעיף זה מבולבל ואינו מתאר התנהגות קוהרנטית של קומפיילר או של תכנות מונחה עצמים. הוא מערבב מושגים של גנריות ורשימות באופן שאינו רלוונטי לשאלה המקורית.
3. לא נכון. הקומפיילר פועל על סמך הטיפוס הסטטי של משתנים. עבור פרמטר
4. לא נכון. בכל הנוגע לדריסת מתודות (overriding), רוב השפות מונחות העצמים (כמו Java ו-C#) דורשות שחתימת המתודה הדורסת תהיה זהה לחלוטין לחתימת המתודה הנדרסת. בפרט, טיפוסי הפרמטרים חייבים להיות זהים (כלל ה-Invariance). לכן, אם מתודה דורסת את
השאלה, על אף ניסוחה הבעייתי, בוחנת את הבנת ההבדלים בין התנהגות הקומפיילר בזמן קומפילציה להתנהגות התוכנית בזמן ריצה, בהקשר של מושגי יסוד בתכנות מונחה עצמים.
1. נכון. בחירה בין מתודות מועמסות (overloading) מתבצעת בזמן קומפילציה, בתהליך שנקרא Overload Resolution. הקומפיילר מזהה את כל המתודות עם השם הנתון (
foo) ובוחר את זו שהחתימה שלה היא ה"מתאימה ביותר" (most specific) לטיפוסים הסטטיים של הארגומנטים בקריאה. אם קיימות שתי גרסאות, למשל foo(Shape s) ו-foo(Triangle t) (כאשר Triangle יורש מ-Shape), ומתבצעת קריאה עם ארגומנט שהטיפוס הסטטי שלו הוא Triangle, הקומפיילר יבחר בגרסה foo(Triangle t) מכיוון שהיא ספציפית יותר. זהו עיקרון מרכזי באופן פעולתו של הקומפיילר.2. לא נכון. הניסוח של סעיף זה מבולבל ואינו מתאר התנהגות קוהרנטית של קומפיילר או של תכנות מונחה עצמים. הוא מערבב מושגים של גנריות ורשימות באופן שאינו רלוונטי לשאלה המקורית.
3. לא נכון. הקומפיילר פועל על סמך הטיפוס הסטטי של משתנים. עבור פרמטר
t שהוגדר בחתימת המתודה כ-Triangle t, הטיפוס הסטטי שלו הוא בדיוק Triangle. הטיפוס הדינמי (הטיפוס של האובייקט בפועל שיועבר בזמן ריצה) יכול להיות Triangle או כל תת-טיפוס שלו (כמו EquilateralTriangle), אך מידע זה אינו זמין לקומפיילר. לכן, הקומפיילר אינו "יודע" שהטיפוס הסטטי הוא תת-טיפוס כלשהו, אלא יודע בוודאות שהוא Triangle.4. לא נכון. בכל הנוגע לדריסת מתודות (overriding), רוב השפות מונחות העצמים (כמו Java ו-C#) דורשות שחתימת המתודה הדורסת תהיה זהה לחלוטין לחתימת המתודה הנדרסת. בפרט, טיפוסי הפרמטרים חייבים להיות זהים (כלל ה-Invariance). לכן, אם מתודה דורסת את
foo(Triangle t), גם לה חייב להיות פרמטר מהטיפוס Triangle בדיוק, ולא מתת-טיפוס שלו. הקומפיילר אוכף כלל זה.