5.2.1. הקדמה – הרעיון ושימושים

Binding – קישור בין ההודעות למתודות.

כאשר יש בשפה גם overriding וגם inclusion polymorphism מתעוררת השאלה מתי מתבצע הקישור הנ"ל.

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

קישור יכול להתבצע בזמן ההידור, בזמן הקישור או בזמן הריצה. בזמן הריצה – ייתכן שנוכל לבצע את ה-binding עם תחילת התוכנית, ויתכן שרק כשנגיע ממש לביטוי, נדע מה המתודה המתאימה לה צריך לקרוא.



Early Binding (static) זהו קישור בזמן הידור. המהדר משתמש בסוג המשתנים כדי לבצע את הקישור בזמן ההידור / ה-linking.

Late Binding (dynamic) זהו מצב בו הקישור בין ההודעה למתודה נעשה בזמן הריצה.

Static binding הוא יעיל יותר, אך גמיש פחות. בדיקות סטאטיות מובילות לקוד בטוח יותר.

Dynamic binding הוא איטי יותר, מכיוון שאנחנו מבצעים פעולות נוספות בזמן ריצה. הוא דורש מנגנון של dynamic type checking, אך עם זאת הוא נותן לנו גמישות וכוח גדולים יותר.

למרות חסרונותיו, הכוח ש-dynamic binding נותן לנו גורם לתכנות מונחה עצמים להסתמך עליו באופן חזק.

דוגמא לשימוש: ניתן להגדיר מחלקה שהיא חיה כללית, וכן מחלקות נורשות המייצגות חיות שונות. לאחר מכן מכולה יכולה להכיל מצביעים מסוג חיות, ולנהל את החיות השונות, להפעיל את הפונקציות המיוחדות להן.

מתי מתבצע החיפוש מהי מחלקת הבסיס של אובייקט? במקרה של Smalltalk ו-Pascal למשל, מתקיים כי super ו-inherited ניתנים לחישוב סטאטי – בזמן קומפילציה.

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

מאת: ניצן

Borland style vptr

לפי מה שאני מכיר:
"חסרון בגישה זו: גם כאשר איננו משתמשים ב-dynamic binding – אנחנו משלמים במקום"
לא נכון , עבור מחלקה A שאין לה מתודות דינמיות לא יווצר כלל המצביע, ולמשל עבור מחלקה B שיורשת מA פשוט נוסיף בהתחלה את המצביע, ואחרי הבלוק של A את שאר האינפורמציה של B . וככה לא משלמים על מה שלא משתמשים ועקרונות C++ נשמרים.
מה שכן באמת הcasting קצת יותר מסובך....
שיתוף:
| עוד