229. Static types and dynamic binding

בהמשך לפעם הקודמת:

ראינו שאם אנחנו מעבירים פרמטרים דינאמיים לפונקציה, מתבצע חיפוש של הOverload המתאים ביותר לפונקציה שלנו.

מה שמפתיע הוא שיש גם התחשבות בטיפוסים הסטטיים המשתתפים בקריאה לפונקציה:

נמשיך עם הדוגמה של פעם שעברה:

יש לנו את הפונקציות הבאות:

1
2
public static void InscribeInShape(Triangle innerShape, Circle circumscribedShape)
public static void InscribeInShape(Circle innerShape, Triangle circumscribedShape)

להן נוסיף את הOverloadים הבאים:

1
2
public static void InscribeInShape(Shape innerShape, Circle circumscribedShape)
public static void InscribeInShape(Triangle innerShape, Shape circumscribedShape)

מה יקרה כאשר נריץ את השורה הבאות?

1
2
3
Shape firstShape = new Triangle();
Shape secondShape = new Circle();
InscribeInShape((dynamic)firstShape, secondShape);

מה שאולי טבעי לחשוב זה שנכנס לOverload של

1
public static void InscribeInShape(Triangle innerShape, Circle circumscribedShape)

שהרי שלחנו את הTriangle בתור פרמטר דינאמי.

ובכן, דווקא נכנס לOverload של

1
public static void InscribeInShape(Triangle innerShape, Shape circumscribedShape)

למה? שלחנו אמנם את firstShape בתור פרמטר דינאמי, אבל את secondShape שלחנו בתור Shape רגיל. הקומפיילר כותב קוד שמחפש בזמן ריצה את הפונקציה המתאימה ביותר עם הדרישות הבאות:

השם שלה הוא InscribeInShape. הפרמטר הראשון שלה צריך להיות מסוגל להתמודד עם הטיפוס של firstShape (כלומר להיות Triangle ומטה) והפרמטר השני שלה צריך להיות Shape ומטה.

מה שקורה כאן בעצם זה מאחר והעברנו את secondShape בתור טיפוס סטטי, הקומפיילר כותב קוד שמחפש פונקציה שיכולה לקבל את הטיפוס הסטטי הנ"ל (ולא "מגדיל ראש" ומשתמש בטיפוס הקונקרטי של secondShape)

איך אפשר לפתור? כמו שראינו בפעם הקודמת, אם נעביר את שני האובייקטים באופן דינאמי למתודה, תהיה התחשבות בטיפוסים שלהם בזמן ריצה.

שיהיה המשך יום דינאמי טוב

שתף