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

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

שלח תגובה
yairyog
הודעות: 39
הצטרף: 08:34 12/11/2009

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

שליחה על ידי 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
לא?

תודה!

Aviad
הודעות: 10
הצטרף: 20:19 18/10/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.

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

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

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

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

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

efrat
הודעות: 33
הצטרף: 00:01 25/10/2009

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

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

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

יש אולי איזה הסבר בתבנית של מה נסגר בזמן קומפילציה ומה בזמן ריצה...? זה לא מסתדר לי... :?
מעבר לבעיית הפולימורפיזם שציינו -
שים לב שהמשתנה ab הוא מסוג A ולכן הוא מדפיס את השדה של A. אם אתה רוצה שהוא יעשה משהו מ B, אתה צריך לעשות CASTING.

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

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

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

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

בעצתך ניסיתי

קוד: בחירת הכל

System.out.print(((B)ab).a);
ואכן הודפס 1

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

מבלבל.... :|

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

תודה על התשובות. אם למישהו יש עוד מה להוסיף אני אשמח לשמוע

efrat
הודעות: 33
הצטרף: 00:01 25/10/2009

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

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

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

מבלבל.... :|

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

אם צריך הסבר מפורט יותר, הוא בסיכום שפירסמתי.

TA_Yoni
הודעות: 236
הצטרף: 13:44 18/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  
המתרגל יוני

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

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

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

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

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

TA_Yoni
הודעות: 236
הצטרף: 13:44 18/10/2009

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

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

תסתכל על המצגות מהרצאה 19 שקופית מספר 15
המתרגל יוני

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

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

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

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

סבבה תודה :)

TA_Yoni
הודעות: 236
הצטרף: 13:44 18/10/2009

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

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

רק חשוב לא להתבלבל - שיטה שאמורה לקבל כארגומנט אובייקט מסוג A יכולה גם לקבל כל משתנה מטיפוס שיורש מ A .
( כל String הוא גם Object )
המתרגל יוני

event
הודעות: 3
הצטרף: 17:06 22/01/2010

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

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

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

והתשובה היא:
ריצה תקינה
ציינו את הסיבה/הפלט: 3
השאלה שלי היא אם זה לא אמור להיות שגיאת זמן ריצה BEXECPTION ולהחזיר 0?

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

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

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

קוד: בחירת הכל

f()
שב B
קורא ל *

קוד: בחירת הכל

super.f () 
שב A

שקורא ל

קוד: בחירת הכל

f(0)
ש נמצא ב B בגלל פולימורפיזם

שקורא ל

קוד: בחירת הכל

super.f(2 + 0)
שב A
שמחזיר
1+2

כל זה מוצב בתוך C עוד מהקריאה שסימנתי ב *
ומוחזר המספר שלוש

event
הודעות: 3
הצטרף: 17:06 22/01/2010

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

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

הבנתי!
תודה על התשובה המפורטת!

שלח תגובה

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