שאלה בנושא הורשה ב-java

ak4il

New member
שאלה בנושא הורשה ב-java

שלום לכם נתקלתי בבעיה שאני לא מצליח לפתור (וגם המרצה שלי משום מה לא מצליח) אודה לכם אם תוכלו לעזור לי. יש לי שני מחלקות מחלקת אב ומחלקת בן בשניהם שתי פונקציות בעלות שמות זהים f1 ו-f2. f1 היא פונקציית עזר של f2 בשתי המחלקות. f2 של מחלקת הבן משתמשת גם ב-f2 של מחלקת האב. אני יוצר אובייקט של מחלקת הבן. הבעיה היא כאשר אני מפעיל את הפונקציה f2 מתוך מחלקת הבן היא קוראת ל-f2 של מחלקת האב ואז כש-f2 קוראת ל-f1 מתבצעת f1 של הבן ולא של האב מה שכמובן נותן exceptions ותוצאות לא הגיוניות. כיצד אני יכול להכריח את f2 של האב לקרוא ל-f1 שלו ולא של הבן. ניסיתי לעשות זאת בעזרת: this.f1 אבל זה לא שינה כלום... אם מישהו יכול לעזור, אודה לו מאוד
 

Zack DA

New member
לא בטוח שהבנתי,

(זה יהיה טוב אם תביא קוד) אבל Instance של מחלקת האב לא יכול לקרוא ל- f1 של הבן, ו- instance של הבן יכול לקרוא ל- f1 של האב ע"י
super.f1();​
 

ak4il

New member
אנסה להסביר

class Father { public void f1() { System.out.println("Father f1"); f2(); } public void f2() { System.out.println("Father f2"); } } class Son extends Father { public void f2() { System.out.println("Son f2"); } public void f1() { System.out.println("Son f1"); f2(); super.f1(); } } the main: public static void main(String[] args) throws IOException { Son obj=new Son(); obj.f1(); } הבעיה היא שפונקציה f1 של האב קוראת לפונקציה f2 של הבן ולא של עצמה, איך אני גורם לה לקרוא ל- f2 של עצמה? הפלט המתקבל הוא: Son f1 Son f2 Father f1 Son f2 ואני רוצה שהשורה האחרונה תהיי Father f2 מקווה שהבהרתי את הבעיה ומאוד מקווה שתוכל לעזור
 

Zack DA

New member
נו, בוודאי !

יש כאן ירושה... אתה דרסת את f2 ע"י הבן... אין מה לעשות. האבא לא מכיר את מי שירש ממנו... אם אתה רוצה, במימוש של הבן תקרא ל- f1 של ה- super, אבל מהצד של האבא אין מה לעשות. זו המשמעות של ירושה.
 

ak4il

New member
תראה...

אני התחלתי ללמוד ג'אווה רק השנה, כך שזה קצת חדש לי.... ב-c++ זה היה עובד בלי בעיה...לפי מה שהבנתי הבעיה נובעת מזה שבג'אווה הפונקציות אוטומטית מוגדרות כ-virtual. זה פשוט ניראה לי לא הגיוני אם דורסים את הגישה של פונקציה במחלקת האב לפונקציית עזר שלה, היא לא תעשה את העבודה שלה כמו שצריך אז מה הטעם לירוש בכלל? בטוח שאין דרך?
 

Zack DA

New member
זו החלטה עיצובית של Sun,

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

voguemaster

New member
זה פשוט

כשפונק' f2 של האב נקראת וקוראת בתוך עצמה ל-f1, ג'אווה קוראת לגרסא החדשה ביותר של f1, כלומר - זו של הבן. כדי להכריח משתמשים ב-super
 
למעלה