דף 1 מתוך 1

שאלה על קאסטינגים ארורים

נשלח: 13:10 22/01/2010
על ידי michal cohen
היי, אם מישהו יודע אשמח לקבל תשובה...
במבחן הזה: http://www.cs.bgu.ac.il/~intro101/wiki. ... lution.pdf
שאלה 5 סעיף 14 - למה זה פולס?
נכון שעשו קאסטינג ל-a להיות B והשיטה תיקבע בזמן קומפילציה ואז כאילו תיקבע השיטה של B ולא של D (שזה כרגע a)... אבל בזמן ריצה שניהם יריצו את השיטה של D לא?

Re: שאלה על קאסטינגים ארורים

נשלח: 13:35 22/01/2010
על ידי efrat
michal cohen כתב:היי, אם מישהו יודע אשמח לקבל תשובה...
במבחן הזה: http://www.cs.bgu.ac.il/~intro101/wiki. ... lution.pdf
שאלה 5 סעיף 14 - למה זה פולס?
נכון שעשו קאסטינג ל-a להיות B והשיטה תיקבע בזמן קומפילציה ואז כאילו תיקבע השיטה של B ולא של D (שזה כרגע a)... אבל בזמן ריצה שניהם יריצו את השיטה של D לא?
בזמן ריצה, הוא יודע רק מה שהקומפיילר אומר לו. ז"א שהקומפיילר אומר לו ש b הוא B כי נעשה כזה קאסטינג.
הוא לא יודע ש"באמת" הכנסת ל a את D אלא אם את עושה קאסטינג שאומר לו את זה.

Re: שאלה על קאסטינגים ארורים

נשלח: 14:04 22/01/2010
על ידי michal cohen
לא הבנתי לחלוטין...
למשל במבחן הזה:
http://www.cs.bgu.ac.il/~intro101/wiki. ... lution.pdf
שאלה 5 סעיף 10, לפי מה שאת אומרת אמור להיות מודפס ARIK ולא YOSEF כי ARIK שייך ל-A ועשו קאסטינג ל-A.
אבל עובדה שבתשובות שם זה מדפיס לפי השיטה של B ולא של A למרות שהיה קאסטינג ל-A....

Re: שאלה על קאסטינגים ארורים

נשלח: 16:04 22/01/2010
על ידי danny
אפרת - הריצה לא תעשה מה שהקומפיילר אומר, אלא תבצע דריסה וזאת לפי מסלול ההורשה, כך שהפונקציה ביורש האחרון היא זו שתבוצע (במידה ואותה הפונקציה דורסת את אלה של המורישים)

Re: שאלה על קאסטינגים ארורים

נשלח: 16:30 22/01/2010
על ידי efrat
danny כתב:אפרת - הריצה לא תעשה מה שהקומפיילר אומר, אלא תבצע דריסה וזאת לפי מסלול ההורשה, כך שהפונקציה ביורש האחרון היא זו שתבוצע (במידה ואותה הפונקציה דורסת את אלה של המורישים)
דני - איבדתי אותך ובדרך הצלחתי לבלבל את עצמי.
במקרה הראשון שמיכל תיארה, הוכנס משתנה D לתוך מצביע ל B (כאשר D יורש מ B).
מה שמבוצע זה השיטה של B ואם הבנתי אותך נכון - היא לא הפונקציה ביורש האחרון... למרות שאני לא סגורה שהבנתי את ההסבר שלך.
אני מסכימה שמה שכתבת קורה בתרחיש השני שמיכל שאלה לגביו.

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

נשמע הגיוני?

Re: שאלה על קאסטינגים ארורים

נשלח: 18:10 22/01/2010
על ידי michal cohen
רק לוודא שהבנתי...
הסיבה במקרה הראשון שאכן השיטה של B בוצעה בסוף היא שמשתנה מסוג B קיבל כתובת של משתנה מסוג D (שהוא יורש מ-B) אבל בקאסטינג ל-B.
מכיוון שהיה קאסטינג ל-B אז מי שקיבל את הכתובת "חושב" שהוא קיבל כתובת של משהו שהוא B ושעכשיו הוא B בעצמו ולכן ייגש לשיטות של B.
כלומר, אם לא היה הקאסטינג השיטה שהיתה מבוצעת בסוף היתה של D.

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

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

אני צודקת? :)

Re: שאלה על קאסטינגים ארורים

נשלח: 19:45 22/01/2010
על ידי efrat
michal cohen כתב: כלומר, אם לא היה הקאסטינג השיטה שהיתה מבוצעת בסוף היתה של D.
זה לא קשור - הנקודה היא ההשמה לתוך משתנה שהוא B ולא הקאסטינג בהכרח...
michal cohen כתב: או בקיצור למבחן - אם אני רואה קאסטינג על משתנה עצמו אני יודעת שהוא יחפש את השיטות החוצה בזמן ריצה (במידה וזה לא שיטה סטטית..) כי הוא יודע מי הוא.
אם אני רואה משתנה שמקבל משתנה אחר בקאסטינג, אז מעכשיו המשתנה שקיבל הוא מסוג מה שהקאסטינג אמר ולא מסוג מה שהמשתנה שהוא קיבל בפועל.

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

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

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

Re: שאלה על קאסטינגים ארורים

נשלח: 23:05 22/01/2010
על ידי michal cohen
אמרת שאפשר להתייחס לכל כלב כאל יונק והוא עדיין יתנהג כמו כלב...
עובדה שלא כמו בקוד...
בקוד נניח D זה הכלב ו-B זה היונק (כי D יורש מ-B)...
אז עובדה שמשתנה b שהוא מסוג B מקבל משתנה שהוא D בקאסטינג ל-B.
אז עכשיו הוא כלב בתחפושת של יונק? או שהוא יונק? הוא יוצא לשיטות החיצוניות שלו?
כי את אמרת שכלב מתנהג כמו כלב כי הוא כלב.
אז b שקיבל משתנה שהוא d בקאסטינג ל-B הוא בעצם יונק שקיבל כלב בתחפושת של יונק.
אבל אם כלב מתנהג כמו כלב אז למה כלב לו עושה שיטות של כלב אלא עושה שיטות של יונק (למה עושה שיטות של B ולא יוצא החוצה לשיטות של D)? בגלל הקאסטינג?
כי אם כן אז אני עדיין רואה את הסתירה למקרה השני שהצגתי.

ועכשיו זה גם בלבל אותי עם a.
כי a קיבל את d ומעכשיו הוא d. והוא עובד בדיוק כמו d ועושה את כל השיטות של d. אז ההבדל פה הוא הקאסטינג כמובן... אז למה במקרה השני עם היוסף זה לא ככה? :(

מקווה שלא ויתרת עלי - יש לי עד יום ראשון להבין את זה :)

Re: שאלה על קאסטינגים ארורים

נשלח: 23:37 22/01/2010
על ידי efrat
michal cohen כתב:אמרת שאפשר להתייחס לכל כלב כאל יונק והוא עדיין יתנהג כמו כלב...
עובדה שלא כמו בקוד...
בקוד נניח D זה הכלב ו-B זה היונק (כי D יורש מ-B)...
אז עובדה שמשתנה b שהוא מסוג B מקבל משתנה שהוא D בקאסטינג ל-B.
אז עכשיו הוא כלב בתחפושת של יונק? או שהוא יונק? הוא יוצא לשיטות החיצוניות שלו?

כי את אמרת שכלב מתנהג כמו כלב כי הוא כלב.
אז b שקיבל משתנה שהוא d בקאסטינג ל-B הוא בעצם יונק שקיבל כלב בתחפושת של יונק.
אבל אם כלב מתנהג כמו כלב אז למה כלב לו עושה שיטות של כלב אלא עושה שיטות של יונק (למה עושה שיטות של B ולא יוצא החוצה לשיטות של D)? בגלל הקאסטינג?
כי אם כן אז אני עדיין רואה את הסתירה למקרה השני שהצגתי.
חשוב מה המשתנה. המשתנה בדוגמא הזאת b הוא מסוג B. ז"א ש b הוא מצביע ליונק ועכשיו הכנסת לו D (כלב). הוא לא יודע שהוא כלב אלא אם את אומרת לו שהוא כלב (קאסטינג)... כי מבחינתו הגדרת אותו כמצביע ליונק.

המקרה השני הוא הפוך. לקחת משתנה שמצביע לכלב ואמרת לו שהוא יונק - כל כלב הוא יונק.
michal cohen כתב: מקווה שלא ויתרת עלי - יש לי עד יום ראשון להבין את זה :)
אני לא מוותרת בקלות :)

Re: שאלה על קאסטינגים ארורים

נשלח: 23:42 22/01/2010
על ידי בר כהן
תסלחו לי שלא עקבתי אחרי כל ההודעות, אבל שאלה 5 סעיף 10, על זה שאלת נכון?

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

Re: שאלה על קאסטינגים ארורים

נשלח: 00:31 23/01/2010
על ידי michal cohen
אוקיי...
אז אם במקרה השני אמרתי לו שהוא יונק... למה הוא עדיין מתנהג כמו כלב?
ז"א למה אחרי שעשיתי קאסטינג ל-A הוא עדיין הלך לשיטה של B? הוא חושב שהוא A עכשיו... לא?

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

הסיבה במקרה השני שהוא לא התנהג כמו הקאסטינג היתה ש-b הוא גם A ולכן לא "חידשתי לו" ולכן הוא המשיך ללכת לשיטות של B.

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

תודה :)

Re: שאלה על קאסטינגים ארורים

נשלח: 13:58 23/01/2010
על ידי TA_Yoni
שדות וחתימות של שיטות\פונקציות נסגרים בזמן קומפילציה.
לגבי שדות גשי להסבר פה -http://myforum.bgu.ac.il/phpBB3/viewtop ... 127&t=4998

לגבי שיטות - החתימה נסגרת בזמן קומפילציה ובזמן ריצה המחשב יחפש את החתימה של השיטה מהטיפוס של האובייקט בזמן ריצה ( כלומר במחלקה שהאובייקט הוא מהסוג שלה בזמן ריצה ) וכלפי מעלה בעץ ההורשה.
יש לזכור\להבין כי אם המחשב מחפש שיטה שהחתימה שלה היא :
(foo(Object
אז גם
(foo(String תתאים

כי כל String הוא גם Object

Re: שאלה על קאסטינגים ארורים

נשלח: 20:32 23/01/2010
על ידי simonf
לדעתי זה false כי במהלך החישוב של X.equals(Y) אחד השדות משתנה בערכו (בגלל increament), ולכן בחישוב השני מתקבל ערך אחר.