שאלה קצרה מתחום הפולימורפיזם ושות'

המנהלים: TA_nimrod, TA_Adi, TA_Igor

שאלה קצרה מתחום הפולימורפיזם ושות'

הודעהעל ידי yairyog » 13:08 21/01/2010

class B
קוד: בחר הכל
public class B extends A{
    public int a;
    private int b;
   
    public B(int a, int b){
       super(a,b);
       this.a = a+1;
       this.b = b+1;
    }
}

Class A
קוד: בחר הכל
public class A{
    public int a;
    private int b;
   
    public A(int a, int b){
       this.a = a;
       this.b = b;
    }
}


למה הקוד:
קוד: בחר הכל
public class test
{
   public static void main(String[] args){
      A ab = new B(0,1);
      System.out.print(ab.a);
        }
}


מדפיס את האפס מ
A
ולא את האחד מ
B
?
הרי המשתנה
ab
מצביע בזמן ריצה על משהו שהוא
B
לא?

תודה!
yairyog
 
הודעות: 39
הצטרף: 08:34 12/11/2009

Re: שאלה קצרה מתחום הפולימורפיזם ושות'

הודעהעל ידי Aviad » 13:46 21/01/2010

כי אתה מנסה להדפיס משהו בגישה ישירה למשתנה. ואין פולימורפיזם על משתנים, רק על שיטות ציבוריות.... למופע ab שיצרת יש שני משתנים בשם a והוא ניגש לזה שמוגדר במחלקה A.
אם נניח תיצור שיטה ב A ו B שנראית משהו כזה:
קוד: בחר הכל
public int Areturn() {
       return this.a;
}

ותדפיס את ab.Areturn, אז זה יגש ספציפית לשיטה שכתובה בB (והשיטה הזאת ניגשת למשתנה שמוגדר במחלקה B) ולא לשיטה שכתובה בA, אפילו שסוג המצביע הוא A.
ואז זה אמור להדפיס 1.
Aviad
 
הודעות: 10
הצטרף: 20:19 18/10/2009

Re: שאלה קצרה מתחום הפולימורפיזם ושות'

הודעהעל ידי yairyog » 14:03 21/01/2010

תודה אבל לא כל כך השתכנעתי :roll:
נכון שאין פולימורפיזם בשדות
אבל ציפיתי שבזמן קומפילציה ab יהיה מסוג A אבל בזמן ריצה הוא יהיה מסוג B ולכן יגש לשדה a שבB

יש אולי איזה הסבר בתבנית של מה נסגר בזמן קומפילציה ומה בזמן ריצה...? זה לא מסתדר לי... :?
yairyog
 
הודעות: 39
הצטרף: 08:34 12/11/2009

Re: שאלה קצרה מתחום הפולימורפיזם ושות'

הודעהעל ידי efrat » 14:10 21/01/2010

yairyog כתב:תודה אבל לא כל כך השתכנעתי :roll:
נכון שאין פולימורפיזם בשדות
אבל ציפיתי שבזמן קומפילציה ab יהיה מסוג A אבל בזמן ריצה הוא יהיה מסוג B ולכן יגש לשדה a שבB

יש אולי איזה הסבר בתבנית של מה נסגר בזמן קומפילציה ומה בזמן ריצה...? זה לא מסתדר לי... :?


מעבר לבעיית הפולימורפיזם שציינו -
שים לב שהמשתנה ab הוא מסוג A ולכן הוא מדפיס את השדה של A. אם אתה רוצה שהוא יעשה משהו מ B, אתה צריך לעשות CASTING.
efrat
 
הודעות: 33
הצטרף: 00:01 25/10/2009

Re: שאלה קצרה מתחום הפולימורפיזם ושות'

הודעהעל ידי yairyog » 14:36 21/01/2010

חשבתי שהבנתי מה הולך בתחום הזה, כנראה שטעיתי

בעצתך ניסיתי
קוד: בחר הכל
System.out.print(((B)ab).a);

ואכן הודפס 1

עד עכשיו ראיתי קאסטינג בין אוביקטים רק כדרך לשקר לקומפיילר כדי לא לקבל שגיאות בקומפילציה, אז לא ציפיתי שתהיה פה תוצאה שונה
ציטוט מאחת המצגות "המשמעות של Casting היא שהמתכנת לוקח על עצמו את האחריות לתקינות הטיפוסים"

מבלבל.... :|

אני עדיין חושב שיש לעניין הזה הסבר מהתחום של מה נסגר בקומפילציה (או לפחות מקווה :P )

תודה על התשובות. אם למישהו יש עוד מה להוסיף אני אשמח לשמוע
yairyog
 
הודעות: 39
הצטרף: 08:34 12/11/2009

Re: שאלה קצרה מתחום הפולימורפיזם ושות'

הודעהעל ידי efrat » 14:44 21/01/2010

yairyog כתב:עד עכשיו ראיתי קאסטינג בין אוביקטים רק כדרך לשקר לקומפיילר כדי לא לקבל שגיאות בקומפילציה, אז לא ציפיתי שתהיה פה תוצאה שונה
ציטוט מאחת המצגות "המשמעות של Casting היא שהמתכנת לוקח על עצמו את האחריות לתקינות הטיפוסים"

מבלבל.... :|

אני עדיין חושב שיש לעניין הזה הסבר מהתחום של מה נסגר בקומפילציה (או לפחות מקווה :P )


ציטט מהמצגת הנכונה - תסתכל בשקף האחרון שלה.
כשאתה יוצר משתנה מסוג A ומכניס לו אובייקט חדש מסוג B זה נכון ותקין, אך מבחינת הקומפיילר, זה עדיין משתנה מסוג A.
אתה יודע שבאמת הכנסת לו B ולכן אתה יכול להגיד לקומפיילר "נכון שיצרתי משתנה מסוג A, אבל אני הכנסתי לתוכו B אז תקרא לו B".
ולכן CASTING.

אם צריך הסבר מפורט יותר, הוא בסיכום שפירסמתי.
efrat
 
הודעות: 33
הצטרף: 00:01 25/10/2009

Re: שאלה קצרה מתחום הפולימורפיזם ושות'

הודעהעל ידי TA_Yoni » 23:36 21/01/2010

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

בדוגמה הספציפית שלך, בזמן קומפילציה ab מטיפוס A . לכן השורה ab.a מחושבת ע"י הקומפיילר ל - 0 , ולא תשתנה בזמן ריצה !!!!
ולכן יש הדפסה של 0.

אם היית מוסיף casting ל B כלומר
System.out.println((B)ab.a
ab בזמן קומפילציה היה מטיפוס B ולכן היה מודפס 1  
המתרגל יוני
TA_Yoni
 
הודעות: 236
הצטרף: 13:44 18/10/2009

Re: שאלה קצרה מתחום הפולימורפיזם ושות'

הודעהעל ידי yairyog » 00:27 22/01/2010

תודה! זה בדיוק ההסבר שחיפשתי :D

אגב איך העובדה שחתימות של פונקציות\שיטות נסגרות בזמן קומפילציה באה לידי ביטוי?
yairyog
 
הודעות: 39
הצטרף: 08:34 12/11/2009

Re: שאלה קצרה מתחום הפולימורפיזם ושות'

הודעהעל ידי TA_Yoni » 10:20 22/01/2010

תסתכל על המצגות מהרצאה 19 שקופית מספר 15
המתרגל יוני
TA_Yoni
 
הודעות: 236
הצטרף: 13:44 18/10/2009

Re: שאלה קצרה מתחום הפולימורפיזם ושות'

הודעהעל ידי yairyog » 10:34 22/01/2010

אה אז הכוונה לחתימה בקריאה לפונקציה

סבבה תודה :)
yairyog
 
הודעות: 39
הצטרף: 08:34 12/11/2009

Re: שאלה קצרה מתחום הפולימורפיזם ושות'

הודעהעל ידי TA_Yoni » 10:37 22/01/2010

רק חשוב לא להתבלבל - שיטה שאמורה לקבל כארגומנט אובייקט מסוג A יכולה גם לקבל כל משתנה מטיפוס שיורש מ A .
( כל String הוא גם Object )
המתרגל יוני
TA_Yoni
 
הודעות: 236
הצטרף: 13:44 18/10/2009

Re: שאלה קצרה מתחום הפולימורפיזם ושות'

הודעהעל ידי event » 18:39 22/01/2010

בנוגע לפולימורפיזם ולאותה שאלה
בסעיף מספר 12
שואלים מה יקרה אם נכתוב:
S.o.p(ab.f());1

והתשובה היא:
ריצה תקינה
ציינו את הסיבה/הפלט: 3
השאלה שלי היא אם זה לא אמור להיות שגיאת זמן ריצה BEXECPTION ולהחזיר 0?
event
 
הודעות: 3
הצטרף: 17:06 22/01/2010

Re: שאלה קצרה מתחום הפולימורפיזם ושות'

הודעהעל ידי yairyog » 00:25 23/01/2010

קוד: בחר הכל
f()
שב B
קורא ל *
קוד: בחר הכל
super.f ()

שב A

שקורא ל
קוד: בחר הכל
f(0)

ש נמצא ב B בגלל פולימורפיזם

שקורא ל
קוד: בחר הכל
super.f(2 + 0)

שב A
שמחזיר
1+2

כל זה מוצב בתוך C עוד מהקריאה שסימנתי ב *
ומוחזר המספר שלוש
yairyog
 
הודעות: 39
הצטרף: 08:34 12/11/2009

Re: שאלה קצרה מתחום הפולימורפיזם ושות'

הודעהעל ידי event » 11:04 23/01/2010

הבנתי!
תודה על התשובה המפורטת!
event
 
הודעות: 3
הצטרף: 17:06 22/01/2010


חזור אל - מבוא למדעי המחשב 2010

מי מחובר

משתמשים הגולשים בפורום זה: אין משתמשים רשומים ואורח אחד