4.3.2.4. Universal Polymorphism4.3.2.4.1. Parametric Polymorphismפולימורפיזם זה קורה עבור מספר אינסופי של סוגים קשורים. פולימורפיזם זה מאפשר להגדיר פעולה מופשטת שתפעל באופן אחיד על ארגומנטים שכולם ממשפחת סוגים דומה. Ad hoc לעומת Parametric: Overloading: פעולה מינימלית – למספר קטן של הפשטות קיים מזהה זהה. אינו מגביר את יכולת הביטוי של השפה – ניתן להיפטר מ-overloading על ידי נתינת שמות שונות להפשטות השונות המתאימות לו. הקשר בין ההפשטות השונות לא בהכרח קיים. Coercion: פעולה גדולה יותר – אותה פונקציה יכולה לשמש למספר מטרות. עם זאת מספר המטרות הינו מוגבל, והערך המוחזר הינו זהה. הקשר בין הצורות מוכתב על ידי ה-coercions, וקשר זה אינו חלק מהשגרה. Polymorphic Type (universal) – להפשטה יחידה יש מספר גדול של משפחות של סוגים קשורים. ההפשטה פועלת באופן אחיד על הארגומנטים שלה ללא תלות בסוגם. מוסיפה כוח ביטוי לשפה על ידי יצירת פונקציות היכולות לקבל מספר לא מוגבל של סוגים. Parametric Type Polymorphism In Pascal: האופרטורים +, *, -, פעולות איחוד וחיתוך קבוצות הינם כולם Parametric Type Polymorphism. הפרוצדורות new, dispose יוצרות משתנה מסוג כלשהו. הערך nil הוא ערך מצביע לסוג כלשהו. [] הקבוצה הריקה מתאימה לכל סוג. Universal pointer in C: בשפת C מצביע מסוג void* יכול להיות מושם לתוך כל מצביע אחר, וכן כל מצביע יכול להיות מושם בתוך משתנה מסוג void*. עובדה זו ב-C איננה ad hoc אלא parametric polymorphism, מכיוון שהיא מוגדרת אוטומטית לכל מצביע. C++ Templates: Templates זוהי הדרך של שפת C++ לממש parametric polymorphism. בעזרת התבניות אנחנו מסוגלים ליצור פונקציות/מחלקות המקבלות פרמטר מסוג כלשהו שיוגדר בהמשך, לפי הצורך. 4.3.2.4.2. Inclusion Polymorphism Inclusion Polymorphism זהו הסוג השני של Universal Polymorphism. סוג זה נובע מקשרי הכללה (הורשה) בין סוגים או קבוצות של ערכים. תזכורת: סוג הוא קבוצת ערכים להם פעולות משותפות. תת סוג (sub type) הוא תת קבוצה של ערכים. דוגמאות:
Subtype:
Subclassing:
ב-Strict Inheritance, מתקיים כי Subclassing Subtyping. פעולות המוגדרות על מחלקת הבסיס מותרות על המחלקות הנורשות ממנה. רוב ה- Inclusion Polymorphism נובעים מ-subtypes. כאשר אנחנו מדברים על Inclusion Polymorphism, אנחנו מדברים על שני אלמנטים:
דוגמא למתודה פולימורפית במחלקות:
המתודה raise_salary היא פולימורפית – היא מסוגלת לקבל את כל תתי הסוגים (תתי המחלקות) של המחלקה Employee. דוגמאות לאובייקטים פולימורפיים:
|
תוכן העניינים:
קישורים רלוונטיים:שיתוף: |
Borland style vptr
לפי מה שאני מכיר:"חסרון בגישה זו: גם כאשר איננו משתמשים ב-dynamic binding – אנחנו משלמים במקום"
לא נכון , עבור מחלקה A שאין לה מתודות דינמיות לא יווצר כלל המצביע, ולמשל עבור מחלקה B שיורשת מA פשוט נוסיף בהתחלה את המצביע, ואחרי הבלוק של A את שאר האינפורמציה של B . וככה לא משלמים על מה שלא משתמשים ועקרונות C++ נשמרים.
מה שכן באמת הcasting קצת יותר מסובך....