overloading,overriding,virtual,new

NetShadow

New member
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 ? תודה רבה
 

yaakov77

New member
..

1.בלבלת בין abstract לבין virtual. abstract אינו ניתן למימוש, virtual כן.
 

yaakov77

New member
..

אם אתה מגדיר אוביקט אב, מאתחל אותו ביורש וקורא ל פונקציית virtual , הoverride תיקרא, למרות שה אובייקט הו צהר על ידי האב.
 

NetShadow

New member
מה ../images/Emo35.gif מה ../images/Emo35.gif מה ../images/Emo35.gif מה ../images/Emo35.gif מה ../images/Emo35.gif

רגע
אם תוכל לענות על השאלות לפי הסדר (מה שאתה יודע כמובן), זה יהיה יותר ממצויין
שנית, חשבתי ש abstract ו virtual זה אותו דבר, בשות בשפות שונות (VB.Net מול #C). אם ב #C יש גם abstract וגם virtual, אשמח לקרוא מה ההבדל בינהם. תודה !!
 

yaakov77

New member
כתבתי מה ההבדל.

abstract אינו ניתן למימוש, virtual כן. לגבי שאר השאלות אשמח לענות אחת אחת היות ואני גולש מ סלולרי היא יכול לשלוח הודעות ארוכות.
 

yuval k

New member
../images/Emo32.gif אין לך אפשרות לגלוש מ-PC? ../images/Emo4.gif

:-‏\
 

yaakov77

New member
..

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

NetShadow

New member
../images/Emo70.gif תודה ל yaakov77, אבל מישהו יכול

לעשות קצת סדר + להרחיב מעט (רק כמה מילים לטובת ההבהרה), מכיוון שהפאלם שלו שיגע אותי
תודה.
 

NetShadow

New member
../images/Emo70.gif../images/Emo70.gif../images/Emo70.gif../images/Emo70.gif../images/Emo70.gif../images/Emo70.gif שאריות :

אלו השאלות שנותרו פתוחות, קרי - לא נענו או נענו בצורה לא מובנת
שוב תודה
6. אם אני כותב מחלקה ורוצה לאפשר למחלקה היורשת ממנה, לבצע override לאחת המתודות, האם אני צריך לציין זאת במפורש לפני שם המתודה, אם כן, בעזרת איזו מילה ? 7. ואם אני רוצה לא לאפשר לדרוס מתודה מסויימת, כיצד אני חוסם זאת ? 8. כאשר אני כותב את המחלקה היורשת, ורוצה לדרוס את אחת המתודות, האם אני חייב לציין לפני שם המתודה החדשה שאני כותב, את המילה override ? אם כן - מדוע ? הוא לא מבין לבד שזו דריסה ? 9. ראיתי במספר מקומות שכותבים את המילה new לפני שם מתודה, למה זה משמש ? 10. אם אני רוצה לממש מתודה במחלקה היורשת, אשר הוגדרה כ virtual במחלקת הבסיס, האם צריך לציין מילה נוספת לפני שם המתודה, או פשוט לכתוב אותה כמו כל מתודה אחרת, ללא ציון ספציפי האומר כי זהו מימוש של virtual ? 11. האם אפשר להגדיר רק מתודה כ virtual וכ abstract, או אפשר גם מחלקה שלמה ? 12. כל ההבדל בין virtual ל abstract הוא שהיורש מ virtual יכול לממש את המתודה, ומ abstract לא ?
 

yaakov77

New member
6

ניתן לבצע overrhde למתודה אם ורק אם הוגדרה כ: override, abstract או virtual. כאשר נסיים לדון בשאלה זו, אתה מוזמן לעבור לבאה.
 

NetShadow

New member
כלומר...

class A { private m_num; override public int Get_5() { return 5; } } class B : A { override public int Get_5() { return 69; } }​
המילה השמורה override משמשת גם כאשר מבצעים דריסה (כתיבה מחדש) של Get_5 בקלאס B, וגם כאשר מגדירים את Get_5 בקלאס A (שם המשמעות שלה היא : המתודה הזו היא ברת דריסה בעתיד). אם הנ"ל נכון, אז הבנתי וניתן להמשיך
 

yaakov77

New member
לא בדיוק.

הפונקציה הראשונה חייבת להיות virtual או abstract. אם דרסת אותה, תוכל לדרוס אותה שוב. אנא כתוב את השאלה הבאה כפתיל באשכול -הראשי-.
 

NetShadow

New member
האשכול הזה לא חייב להיות כזה ארוך..

כלומר ע"מ לעשות override למתודה, אזי היא חייבת להיות מוגדרת ב virtual או abstarct במחלקת הבסיס. אם פונקציה מוגדרת כ virtual במחלחת הבסיס, אז במחלקת הבסיס עצמה אני יכול לממש אותה, וגם במחלקות היורשות ממנה. אבל אם פונקציה מוגדרת כ abstract, אני לא יכול לממש אותה, אז על אחד כמה וכמה אני לא יכול לבצע לה override... לא סתם כתבתי את כל השאלות ע"פ הסדר. אם יש לך ידע וכוח
אזי פשוט כתוב תגובה אחת, שהתשובות בה מסופררות בהתאם לשאלות.
 

yaakov77

New member
..

את הabstrctית אתה לא יכול לממש בבסיס, אבל -לא רק יכול, אלא חייב- לדרוס בכל אחת מה יורשות. )שכחתי לציין זאת קודם(.
 

NetShadow

New member
אז כל ההבדל בין אבסטרקט לוירטואל

הוא שאת הראשון לא ניתן לממש במחלקת הבסיס, ואת השני כן ?
 
למעלה