שאלה בנושא ירושות ופולימורפיזם בJAVA - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


אורח אפרת

Recommended Posts

שלום!

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

והשאלה היא..

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

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

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

קישור לתוכן
שתף באתרים אחרים

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

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

קישור לתוכן
שתף באתרים אחרים

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

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

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

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

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

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

קישור לתוכן
שתף באתרים אחרים

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

 

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

 

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

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...