4.3.2.3. Ad Hoc Polymorphism

4.3.2.3.1.    Overloading

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

דוגמא למשל: למילה static ב-C/C++ יש מספר משמעויות, בהתאם להקשר בו אנחנו משתמשים בה.

נאמר שאופרטור הוא מועמס אם האופרטור מייצג שתיים או יותר פונקציות שונות.

ב-Pascal, C ו-ML רק אופרטורים ומזהים הנמצאים build-in בשפה הם אופרטורים מועמסים.

C++ לעומתם מכילה מנגנון המאפשר למתכנת לחפוף אופרטורים (כמעט) כרצונו.



4.3.2.3.2.    Coercions

Coercion זהו מיפוי שקוף של ערכים מסוג אחד אל ערכים מסוג אחר.

לדוגמא, Pascal מבצעת מיפוי שקוף של ערכים מסוג integer לסוג real.

הפונקציה sqrt(n) המיועדת לערכים מסוג real תעבוד גם כאשר n הוא מסוג integer.

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

השימוש ב-Coercion יוצר לעתים דו משמעות. לעתים נדרשות מספר המרות כדי להמיר מסוג אחד לאחר. המסלול של ההמרה יכול להשפיע על התוצאה הסופית.

מסלול ההמרה אינו עץ ואף אינו בהכרח גרף מכוון.

המצב מסתבך עוד יותר כאשר מערבים coercion עם overloading. מה יקרה, למשל, כאשר מנסים לחבר ערכים מסוגים שונים?

ב-C++ למשל, מיושמת הגישה הבאה:

בהינתן פונקציה F(a1, a2, …, an) יתכנו מספר רב של גרסאות מועמסות של F.

C++ בוחרת בזמן הידור את הפונקציה המתאימה, לפי פרמטרים שונים:

  • מקרים בהם אין צורך בהמרה או קיים צורך בלתי נמנע בהמרה: plot:\[{\text{array}} \to {\text{pointer, T}} \to {\text{const
      T}}\].
  • הגדלת גודל הערך: plot:\[{\text{short}} \to
      {\text{int,float}} \to {\text{double}}\].
  • המרות סטנדרטיות: plot:\[{\text{double}} \to
      {\text{int,int}} \to {\text{double,derived}} \to {\text{base,}}...\].
  • המרות שהוגדרו על ידי המשתמש.

הבחירה בין האפשרויות השונות נעשית על ידי "תחרות" בין הפונקציות.

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



מאת: ניצן

Borland style vptr

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