overloading,overriding,virtual,new
קראתי קצת על OOP בספר המקוון שמלצתם כאן בפורום. אני קצת מתבלבל בין המושגים הנ"ל, ע"פ ידיעותי :
Overloading
זה כאשר אני מגדיר בתוך אותה מחלקה יותר ממתודה אחת בעלת אותו השם, אך עם חתימה שונה (מספר פרמטרים/ סוגם. (ערך החזר אינו חלק מהחתימה למיטב ידיעותי)) כאשר המטרה היא לאפשר פונקציונליות שונה במקצת, עבור אותה פעולה (בגדול), ולאפשר נוחות וגמישות עבור המשתמש בפונקציות.
Overriding
זה כאשר אני יוצר מחלקה שיורשת ממחלקה אחרת, דורס את אחת המתודות של מחלקת הבסיס וכותב אותה מחדש עם פונקציונאליות חדשה.
virtual
משתמשים במילה זו כאשר רוצים להגדיר מתודה אשר אין לי מימוש במחלקה שבה היא מוגדרת (גם אם רוצים, זו תהיה שגיאת קומפילציה לממש אותה), אלא היא תקבל מימוש רק במחלקה היורשת ממחלקה זאת (ושם יהיו חייבים לממש אותה.
שאלות
1. האם ההגדרות הנ"ל מדוייקות ? או שחטאתי בצורה קטסטרופלית ? 2. האם ערך ההחזר של הפונקציה באמת אינו חלק מחתימתה ? מדוע ? 3. האם אכן לא ניתן לממש מתודה virtual במחלקה בה היא מוגדרת ? 4. אני מכיר את המושג overloading (העמסה) בהקשר של כתיבת מספר פונקציות באותה מחלקה, בעלות שם זהה, אבל אין קוראים למצב שבו אני מעניק משמעות חדשים לאופרטרים ? (למשל הענקת משמעות לאופרטור החיבור (+) כאשר מחברים בין אובייקטים מסויימים) ? 5. האם אני אכן חייב לממש מתודה virtual במחלקה היורשת ? 6. אם אני כותב מחלקה ורוצה לאפשר למחלקה היורשת ממנה, לבצע override לאחת המתודות, האם אני צריך לציין זאת במפורש לפני שם המתודה, אם כן, בעזרת איזו מילה ? 7. ואם אני רוצה לא לאפשר לדרוס מתודה מסויימת, כיצד אני חוסם זאת ? 8. כאשר אני כותב את המחלקה היורשת, ורוצה לדרוס את אחת המתודות, האם אני חייב לציין לפני שם המתודה החדשה שאני כותב, את המילה override ? אם כן - מדוע ? הוא לא מבין לבד שזו דריסה ? 9. ראיתי במספר מקומות שכותבים את המילה new לפני שם מתודה, למה זה משמש ? 10. אם אני רוצה לממש מתודה במחלקה היורשת, אשר הוגדרה כ virtual במחלקת הבסיס, האם צריך לציין מילה נוספת לפני שם המתודה, או פשוט לכתוב אותה כמו כל מתודה אחרת, ללא ציון ספציפי האומר כי זהו מימוש של virtual ? תודה רבה
קראתי קצת על OOP בספר המקוון שמלצתם כאן בפורום. אני קצת מתבלבל בין המושגים הנ"ל, ע"פ ידיעותי :