ABA


"שאלה לפני מבחן בנושא Upcasting Downcastin"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15700 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15700
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק, 2 נקודות
   12:12   02.02.10   
אל הפורום  
  שאלה לפני מבחן בנושא Upcasting Downcastin  
 
   טוב אני מקווה שאני יקבל תשובה לפני 5 =]


נתון הקטע קוד הבא ב JAVA


public class yosi {
public int x;

public void x ()
{
System.out.println ("X under Yosi");
}

}

public class dani extends yosi
{
public int x=5;

public void x ()
{
System.out.println ("X under Dani");
}
}


public class mianmain {

public static void main(String args) {


yosi yosi = new yosi();
dani dani = new dani();
yosi test;

test =(yosi)dani;
test.x();
System.out.println (test instanceof dani);

}

}


הפלט המתקבל

X under Dani
true


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

מישהוא יכול לתתלי הסבר על upcasting?
תודה...



                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  זה כי בגאווה כל השיטות הן ווירטואליות ronen333  02.02.10 16:13 1
     אחלה Yariv-H 02.02.10 16:47 2
     זה לא כי הן וירטואליות.. זה כי הקישור דינמי ldan192  02.02.10 19:36 3
         מה זה משנה איך אתה קורא לזה? ronen333  02.02.10 20:42 4
             כי מה שרשום ב-wiki גם לא נכון. final ממש לא הופך אותן ldan192  02.02.10 21:27 5
                 הם לא רשמו שזה הופך את זה לסטטי הם רשמו ש ronen333  02.02.10 21:41 6
                 זה דיי נכון. Deuce  04.02.10 03:30 7
                     כן, אבל זה לא הופך אותה לסטטית (מה שמשתמע ldan192  04.02.10 07:46 9
                         מי מלמד ככה? Deuce  05.02.10 03:18 10
  תשובה נכונה יותר. Deuce  04.02.10 03:48 8

       
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   16:13   02.02.10   
אל הפורום  
  1. זה כי בגאווה כל השיטות הן ווירטואליות  
בתגובה להודעה מספר 0
 
   אז כל השיטות שנמצאות במחלקה היורשת(דני במקרה שלך) דורסות את הפעולות של המחלקה המורישה(יוסי במקרה שלך).


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק, 2 נקודות
   16:47   02.02.10   
אל הפורום  
  2. אחלה  
בתגובה להודעה מספר 1
 
   תודה רבה!



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   19:36   02.02.10   
אל הפורום  
  3. זה לא כי הן וירטואליות.. זה כי הקישור דינמי  
בתגובה להודעה מספר 1
 
כלומר, אולי הטיפוס הסטטי משמשאל לשווה הוא A, אבל הטיפוס הדינמי הוא מה שמימין ל-new - ה-B.
פונקציות וירטואליות זו שיטה ב-#C/++C לאפשר קריאה למתודות לפי הקישור הדינמי... (vptr, vtbl וכו'..)


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   20:42   02.02.10   
אל הפורום  
  4. מה זה משנה איך אתה קורא לזה?  
בתגובה להודעה מספר 3
 
   ערכתי לאחרונה בתאריך 02.02.10 בשעה 20:47 בברכה, ronen333
 
http://en.wikipedia.org/wiki/Virtual_function#Java
זה מה שזה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   21:27   02.02.10   
אל הפורום  
  5. כי מה שרשום ב-wiki גם לא נכון. final ממש לא הופך אותן  
בתגובה להודעה מספר 4
 
לסטטיות.

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


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   21:41   02.02.10   
אל הפורום  
  6. הם לא רשמו שזה הופך את זה לסטטי הם רשמו ש  
בתגובה להודעה מספר 5
 
   Only methods marked with the keyword final are non-virtual

זה הופך את זה ללא ווירטואלי..

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות, דרג אמינות חבר זה
   03:30   04.02.10   
אל הפורום  
  7. זה דיי נכון.  
בתגובה להודעה מספר 5
 
קודם כל, אכן עדיף להמנע משימוש במונח Virtual ב-JAVA - בזה אני מסכים עם עידן 100%. אני מבין שאתה בא פחות מתחום ה-JAVA אז נראה לך סביר להשתמש במושג הזה, אך הוא באמת חסר כל שימוש ברגע שאין דבר כזה בשפה

בחזרה ל-final - המילה השמורה final אכן הופכת את המתודה ל-non-virtual מהבחינה הזאת שלא ניתן לדרוס אותה. ובכלל, כאשר אתה רוצה שלא יירשו מהמחלקה שלך אתה מגדיר אותה כ-final.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   07:46   04.02.10   
אל הפורום  
  9. כן, אבל זה לא הופך אותה לסטטית (מה שמשתמע  
בתגובה להודעה מספר 7
 
מ-non-virtual).

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


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות, דרג אמינות חבר זה
   03:18   05.02.10   
אל הפורום  
  10. מי מלמד ככה?  
בתגובה להודעה מספר 9
 
בסה"כ אביעד הגיב כאן כאדם שלא ממש קשור ל-JAVA ולכן יצאה לו תגובה קצת מוזרה חח. באופן כללי, אני חושב שבלימוד תקין של JAVA לא צריך להזכיר בכלל את המילה VIRTUAL אלא בהשוואה מול שפות אחרות. כשלמדתי קורסים ב-JAVA דיברתי המון על ה-dynamic dispatch (שזה לסיכומו של יום דבר נחמד).

ובחזרה לנושא היותר מעניין - אני לא חושב ש-non virtual רומז על static, לא רואה ממש את הקשר. השאלה היא מה זה בכלל רומז. ב-java כאשר מצהירים על פונקציה כ-final אז פשוט אי אפשר לדרוס אותה. השורה קצת מיותרת, אבל לאנשים שיודעים רק java ורוצים להבין את משמעות ה-virtual, היא נותנת אינטואיציה טובה.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות, דרג אמינות חבר זה
   03:48   04.02.10   
אל הפורום  
  8. תשובה נכונה יותר.  
בתגובה להודעה מספר 0
 
המנגנון של JAVA לא כל כך פשוט, והתשובה פה הייתה לא מספיק ממצה לטעמי.
נתחיל במקרה הפשוט - כאשר אתה מצהיר על משתנה:

dani d = new dani();

אין פה שום דרך להתבלבל. במחלקה של דני יש פונקציה שנקראת x, והיא פשוט נקראת. מן הסתם dani instanceof dani.

UP-CASTING הוא מנגנון סטטי שמופעל במהלך הקומפילציה ומשנה את הטיפוס הסטטי להיות הטיפוס החדש. ברגע שעשית לדני UPCASTING זה שקול להגדרת:

yosi test = new dani();

מהבחינה הזאת שהטיפוס הסטטי הוא yosi והדינאמי הוא דני.
מפה, התשובה תתבסס בהסתמך על המנגנון המתאים -
במהלך הקריאה למתודה x מופעל מנגנון הקריאה הדינאמי שמריץ את הפונקציה של דני (הטיפוס הדינאמי).
המהלך הקריאה ל-instanceof נבדק ה-instance שוב עפ"י הטיפוס הדינאמי (ואכן dani instanceof dani).

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


public class yosi {
public int x;

public void x ()
{
System.out.println ("X under Yosi");
}

public static void foo() { System.out.println("foo in Yosi"); }
}

public class dani extends yosi
{
public int x=5;

public void x ()
{
System.out.println ("X under Dani");
}

public static void foo() { System.out.println("foo in dani"); }
}


yosi yosi = new yosi();
dani dani = new dani();
yosi test;

test =(yosi) dani;
test.foo();
dani.foo();

במקרה זה הפלטים יהיו שונים כי יופעל המנגנון הסטטי של הקומפיילר (אלו הן פונקציות static).
התוצאה תהיה אפוא foo in yosi עבור הראשון ועבור השני foo in dani.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net