4.2.1. סיווג שפותמספר מושגים:
למה בעצם אנחנו צריכים לדבר על ערכים וסוגים כאשר אנחנו מדברים על הורשה? נניח שיש לנו את הביטוי a + b.
נשאל: איזה פעולה תבוצע? אם a, b הינם שלמים, יתבצע חיבור בשלמים. אם a, b הם
מספרים מסוג float יתבצע חישוב נקודה צפה. אם הם מחלקות, ייקרא לפיכך, יש חשיבות לדעת מה הסוג של האובייקט כדי לדעת איזה פעולה תפעל עליו, ולכן נפתח את הדיון בנושא. סיווג שפות לפי חשיבות הסוגים:
סיווג שפות לפי זמן אכיפת הסוגים:
כפי שצוין, לשפת C טיפוסיות חלשה. ניתן לעשות casting ולהתייחס לכל נתונים שהם כאל מערך של בתים. בדומה, גם union הקיים בשפת C הינו סימן לטיפוסיות חלשה. בשפת C אפילו הביטוי הבא חוקי, וזאת כי הסוגריים הופכים לפעולת החיבור: int *p; 3[p]; האם טיפוסיות חלשה היא בהכרח דבר רע? יש
לטיפוסיות חלשה שימושים לא מעטים. למשל, שימוש שנעשה לעיתים הינו ליצר רשימה
מקושרת חסכונית בזיכרון – על ידי שימוש ב-XOR בין כתובת בעיה עם המימוש של רשימה מקושרת דו כיוונית עם XOR בין מצביעים: אנחנו מסתמכים בה על ההנחה של-long ול-address יש גודל זהה. אם בעתיד עובדה זו תשתנה, כל הרשימות המבוססות על טריק זה יפסיקו לעבוד. לפיכך – לפי הגישה של OOP, המנסה להפריד בין המימוש לבין הממשק, טיפוסיות חלשה היא בהחלט דבר לא חיובי. |
תוכן העניינים:
קישורים רלוונטיים:שיתוף: |
Borland style vptr
לפי מה שאני מכיר:"חסרון בגישה זו: גם כאשר איננו משתמשים ב-dynamic binding – אנחנו משלמים במקום"
לא נכון , עבור מחלקה A שאין לה מתודות דינמיות לא יווצר כלל המצביע, ולמשל עבור מחלקה B שיורשת מA פשוט נוסיף בהתחלה את המצביע, ואחרי הבלוק של A את שאר האינפורמציה של B . וככה לא משלמים על מה שלא משתמשים ועקרונות C++ נשמרים.
מה שכן באמת הcasting קצת יותר מסובך....