עבור לתוכן

שאלה בנושא ירושות ופולימורפיזם בJAVA

Featured Replies

פורסם

שלום!

הגדרתי מחלקת אב , 2 מחלקות בנים שיורשות ממנו ואח"כ אוסף מהסוג של האב כך שהאוסף מכיל את מחלקות הבנים.

והשאלה היא..

כשאני עוברת על האוסף בforeach איך אני יכולה לבדוק על איבר ספציפי אם הוא הבן הראשון או השני?

ואם הוא הבן השני אז כשאני בודקת אם הוא הראשון התוכנית לא תעוף לי...

תודה רבה!!! :)

פורסם

נסי לבדוק את סוג האובייקט של כל איבר בעזרת instanceof.

פורסם

זה אפשרי, אבל כל הפואנטה בפולימורפיזם היא להימנע מבדיקות כאלה.

השאלה היא למה את צריכה לבדוק. יעזור אם תכתבי פה מה את רוצה לעשות עם האובייקטים, ואפילו תתני קטע קוד רלוונטי.

  • 2 שבועות מאוחר יותר...
פורסם

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

הריי בJAVA יש לך אפילו REFLECTION שזה אפילו "יותר גרוע" מלבדוק מחלקות.

פורסם

בגדול יש 2 דרכים קלאסיות לעשות את זה:

1. לממש פונקציה pure virtual באופן שונה בכל אחת מתתי המחלקות. הפונקציה תחזיר ערכים שונים בכל תת מחלקה, וכך את יכולה להבדיל ביניהן.

2. לשמור מזהה במחלקת האב. בקונסטרקטור של כל מחלקת בן את קוראת לקונסטרקטור של האבא עם ערך שונה. כדי לבדוק איזו מחלקה זו את קוראת את הערך ששמור אצל האבא.

אפשר לחשוב על פתרונות נוספים

הפתרון הראשון הוא הפולימורפיזם ששאלת עליו. הפתרון השני הוא לא. מבחינת צריכת זיכרון, דווקא הפתרון של הפולימורפיזם תופס יותר מקום (אפשר להגיד בצורה מפתיעה). בפתרון של הפולימורפיזם נשמר לך מאחורי הקלעים "מצביעים" לפונקציות הוירטואליות. בפתרון השני את שומרת רק ערך אחד.
אפשר לחשוב על פתרון נוסף שקשור לפולימורפיזם והוא שבמחלקת האב יהיו לך שתי פונקציות שיחזירו תמיד false. הפונקציה הראשונה תחזיר true אם זה הבן הראשון והפונקציה השניה תחזיר true אם מדובר בבן השני. בשני הבנים את מעמיסה רק פונקציה אחת שתחזיר true בהתאמה.

פורסם

קודם כל, בג'אווה אין כזה דבר pure virtual, זה נקרא abstract.

 

חוץ מזה, הפתרון הראשון דווקא לא תופס עוד זכרון. האובייקט לא מחזיק רפרנס לכל פונקציה שלו, אלא רק רפרנס למחלקה שלו. המחלקה עצמה מחזיקה רפרנס לפונקציות. כשמוסיפים פונקציה זה רק מוסיף עוד מצביע אחד למחלקה, לא לכל מופע שלה. לעומת זאת הוספת שדה למחלקה מוסיפה אותו לכל מופע של המחלקה.

 

בכל מקרה, שכחת את הפתרון ש-smalul הציע, שהוא שימוש ב-instanceof. הוא יותר הגיוני מלכתוב פונקציה ייעודית שלא עושה שום דבר חוץ מלחקות את instanceof.

פורסם

צודק.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים