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

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

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

הודעהעל ידי michal cohen » 13:10 22/01/2010

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

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

הודעהעל ידי efrat » 13:35 22/01/2010

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


בזמן ריצה, הוא יודע רק מה שהקומפיילר אומר לו. ז"א שהקומפיילר אומר לו ש b הוא B כי נעשה כזה קאסטינג.
הוא לא יודע ש"באמת" הכנסת ל a את D אלא אם את עושה קאסטינג שאומר לו את זה.
efrat
 
הודעות: 33
הצטרף: 00:01 25/10/2009

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

הודעהעל ידי michal cohen » 14:04 22/01/2010

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

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

הודעהעל ידי danny » 16:04 22/01/2010

אפרת - הריצה לא תעשה מה שהקומפיילר אומר, אלא תבצע דריסה וזאת לפי מסלול ההורשה, כך שהפונקציה ביורש האחרון היא זו שתבוצע (במידה ואותה הפונקציה דורסת את אלה של המורישים)
Error is Created. Truth is Eternal. Error, or Creation, will be Burned up, & then, & not till Then, Truth or Eternity will appear
danny
 
הודעות: 64
הצטרף: 12:32 23/10/2009

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

הודעהעל ידי efrat » 16:30 22/01/2010

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


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

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

נשמע הגיוני?
efrat
 
הודעות: 33
הצטרף: 00:01 25/10/2009

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

הודעהעל ידי michal cohen » 18:10 22/01/2010

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

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

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

אני צודקת? :)
michal cohen
 
הודעות: 87
הצטרף: 19:04 11/11/2009

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

הודעהעל ידי efrat » 19:45 22/01/2010

michal cohen כתב:כלומר, אם לא היה הקאסטינג השיטה שהיתה מבוצעת בסוף היתה של D.


זה לא קשור - הנקודה היא ההשמה לתוך משתנה שהוא B ולא הקאסטינג בהכרח...

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

אני צודקת? :)


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

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

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

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

הודעהעל ידי michal cohen » 23:05 22/01/2010

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

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

מקווה שלא ויתרת עלי - יש לי עד יום ראשון להבין את זה :)
michal cohen
 
הודעות: 87
הצטרף: 19:04 11/11/2009

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

הודעהעל ידי efrat » 23:37 22/01/2010

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

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



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

המקרה השני הוא הפוך. לקחת משתנה שמצביע לכלב ואמרת לו שהוא יונק - כל כלב הוא יונק.

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


אני לא מוותרת בקלות :)
efrat
 
הודעות: 33
הצטרף: 00:01 25/10/2009

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

הודעהעל ידי בר כהן » 23:42 22/01/2010

תסלחו לי שלא עקבתי אחרי כל ההודעות, אבל שאלה 5 סעיף 10, על זה שאלת נכון?

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

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

הודעהעל ידי michal cohen » 00:31 23/01/2010

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

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

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

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

תודה :)
michal cohen
 
הודעות: 87
הצטרף: 19:04 11/11/2009

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

הודעהעל ידי TA_Yoni » 13:58 23/01/2010

שדות וחתימות של שיטות\פונקציות נסגרים בזמן קומפילציה.
לגבי שדות גשי להסבר פה -http://myforum.bgu.ac.il/phpBB3/viewtopic.php?f=127&t=4998

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

כי כל String הוא גם Object
המתרגל יוני
TA_Yoni
 
הודעות: 236
הצטרף: 13:44 18/10/2009

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

הודעהעל ידי simonf » 20:32 23/01/2010

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


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

מי מחובר

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