לנץ קרן מרצה: תכנותמונחהעצמים) 236703 ( א' מועד 2012, חורף סמסטר סמסטר סוף מבחן קרבי אלעד רביב, אריאל מושקוביץ, אייל מתרגלים: הנחיות:.1.2.3.4.5.6.7 השאלות. כל על לענות עליכם משקל. שוות שאלות 5 במבחן יוםשני 02 פברואר 0200 מהנקודות. 20% ותקבלו יודע/ת" "לא כתבו התשובה, את יודעים אינכם אם שאלה, בכל בכלשאלהבהנדרשלצייןאתפלטהקוד,ייתכןכיהקודלאמתקמפל.במקרהזהיש לצייןאתשגיאתהקומפילציהאוזמןהריצהולהסבירמדועהיאמתרחשת. על הניתן בציון תפגע נכון( הוא אם )אף בעליל רלוונטי לא מידע הוספת לעניין. ענו שלילי. ניקוד למתן אף קיצוניים ובמקרים התשובה, ברור. בכתב תשובתכם כתבו חדש. בעמוד תשובה כל התחילו עזר. חומר בכל להשתמש אין כולם. את שקיבלתם כעת וודאו (, זה עמוד כולל ( עמודים 6 במבחן 8..9 שעות. שלוש הבחינה משך בהצלחה!! 2112 חורף 1 236703 עצמים מונחה תכנות
שאלה 1 ++C, מבנה האובייקט נתונות המחלקות הבאות ב ++C: struct A { virtual void f(int i) { cout << i; A() { f(0); A(int i) { f(i); ; struct B1 : virtual A { B1(int i) : A(i) { f(i); virtual void f(int i) { cout << i+10; ; struct B2 : A { B2(int i) : A(i) { f(i); virtual void f(int i) { cout << i+20; ; struct C : B1, B2 { C() : B2(4),B1(5){ ; מה ידפיס הקוד הבא? הסבירו. C* c = new C(); א. ב. כעת הוסיפו למחלקה C את המתודה הבאה: virtual void f(int i) { cout << i+30; ((B1*)c)->f(6); ((B2*)c)->f(6); ג. האם תשובתכם לסעיף א' תשתנה? הסבירו. מה ידפיס הקוד הבא )בהמשך לקוד מהסעיפים הקודמים(? הסבירו. f במחלקה C כך: ד. כעת שינו את ההגדרה של virtual void f() { cout << 30; האם תשובתכם לסעיף ג' תשתנה? הסבירו. 2
שאלה 2 Variance ב-#C תזכורת: ב- 4.0 #C יש תמיכה ב covariance ו-contravariance עבור טיפוסים גנריים ב-interface ו-delegate. כך ש: interface I1<out T> { הוא קו-וריאנטי ביחס ל-T, ו- interface I2<in T> { הוא קונטרה-וריאנטי ביחס ל-T. א. אייל כתב את הקוד הבא: שגרם לשגיאת הקומפילציה: class A<out T>{ Invalid variance modifier. Only interface and delegate type parameters can be specified as variant. מהי הסיבה לכך שהשפה אינה תומכת ב-variance של טיפוסים גנריים במחלקות? בכל הסעיפים הבאים, עליכם להמיר קוד שנכתב לפני גרסא 4.0 לתמוך ב-variance. לכל טיפוס פרמטרי, ציינו האם ניתן לסמנו כ-out in, או אף אחת מהאפשרויות. הניחו קיום המחלקה הבאה: class Record<T>{ public readonly T data; Record(T t){data = t; interface I1<T>{T Data{get; ב. interface I2<T>{Record<T> Data{get; interface I3<T>{ void SetData(T data); delegate T F<T,U>(U u); delegate T F<T>(T t); ג. ד. ה. ו. 3
שאלה 3 קישור של מתודות ב-Java נתונות המחלקות הבאות ב :Java א. ב. public class A { public A(){f(this); public void f(a a) {System.out.println("A.f(A)"); public class B extends A{ public B(){f(this); public class C extends B { public void f(a a) {System.out.println("C.f(A)"); public void f(b b) {System.out.println("C.f(B)"); public void f(c c) {System.out.println("C.f(C)"); מה ידפיס הקוד הבא? הסבירו. כעת הוסיפו למחלקה B את המתודה הבאה: A a = new C(); public void f(b b) {System.out.println("B.f(B)"); האם תשובתכם לסעיף א' תשתנה? הסבירו. ג. כעת שינו את המתודה מהסעיף הקודם מ תשתנה? הסבירו. public ל.private האם תשובתכם לסעיף ב' B b = new B(); ד. ה. בהמשך לקוד מהסעיפים הקודמים, מה ידפיס הקוד הבא? הסבירו. בהמשך לקוד מהסעיפים הקודמים, מה ידפיס הקוד הבא? הסבירו. a.f(b); ו. כעת הוסיפו למחלקה B את המתודה הבאה: private void f(a a) {System.out.println("B.f(A)"); האם תשובתכם לסעיף ה' תשתנה? הסבירו. 4
שאלה 4 Arrays Java Generics and נתון הקוד הבא: public interface ExtendedIterator<T> extends Iterator<T>{ void set(t data); public interface ExtendedIterable<T> extends Iterable<T>{ public ExtendedIterator<T> iterator(); public class IterableArray<T> implements ExtendedIterable<T>{ T[] array; IterableArray(T[] a){ this.array = a; //* @Override public ExtendedIterator<T> iterator() { return new ExtendedIterator<T>() { int index = -1; @Override public boolean hasnext() { return index + 1 < array.length; @Override public T next() { return array[++index]; @Override public void remove() { throw new UnsupportedOperationException(); @Override public void set(t data) { array[index] = data; ; א. ב. נתון הקוד הבא: IterableArray i = new IterableArray<String>(new String[5]); האם קוד זה עובר קומפילציה? אם כן, מהי התכונה שמאפשרת זאת? אם לא, הסבר מדוע. השלימו את השורות החסרות בקטע הקוד הבא כך שהקוד יעבור קומפילציה אך יגרום לשגיאת זמן ריצה. הניחו קיום מחלקות A ו-B כך ש B. extends A זכרו לכתוב את תשובתכם במחברת הבחינה. IterableArray<A> ia1 = new ; //1 ExtendedIterator<A> ei = ia1.iterator(); A a = ei.next(); ei.set(new ); //2 סטודנטים בקורס תכנות מונחה עצבים הציעו מספר דרכים לפתרון חלק מהבעיות בקוד. בכל סעיף קבע/י האם ההצעה תצליח לפתור את הבעיה שהתכוונה לפתור. אם כן, איזו בעיה, אילו שינויים נוספים נדרשים בקוד. אם לא, הסבר מדוע ההצעה נכשלה. ג. אלעד מציע להחליף את הקוד בבנאי של IterableArray )מסומן ב-* ב( קוד הבא: this.array = new T[a.length]; for(int i = 0; i < a.length; ++i){ this.array[i] = a[i]; ד. אריאל מציע להחליף את הקוד בבנאי של IterableArray )מסומן ב-*( בקוד הבא: this.array = new ArrayList<T>(Arrays.asList(a)); ושינוי הטיפוס של השדה array ב-IterableArray ל-.ArrayList<T> 5
שאלה 5 Squeak copy Object במחלקת המוגדרת copy מתודת של הקוד להלן ^self shallowcopy postcopy הבאה: המחלקה את הגדירה קרן א. Object subclass: #MyClass instancevariablenames: 'x' classvariablenames: '' pooldictionaries: '' category: 'Exam' initialize x := OrderedCollection new. addtocollection: anobject x add: anobject. ב..MyClass מטיפוס משתנה להעתיק ננסה כאשר בעיה להיווצר יכולה זה, קוד בהינתן הבעיה. את המדגים קצר קוד כתבו תיפתר. שהבעיה כך MyClass במחלקת postcopy המתודה את ממשו hasthesameinstvariables ^self allinstvarnames hasequalelements: self class allinstvarnames הסעיפיםהבאיםאינםקשוריםלסעיפיםהקודמים. הבאה: המתודה את Object למחלקת מוסיף אריאל הבא: באופן Behavior במחלקה מוגדרת allinstvarnames המתודה allinstvarnames "Answer an Array of the names of the receiver's instance variables. The Array ordering is the order in which the variables are stored and accessed by the interpreter". vars superclass == nil iftrue: [vars := self instvarnames copy] "Guarantee a copy is answered". iffalse: [vars := superclass allinstvarnames, self instvarnames]. ^vars.instance תזכורת:למחלקותObjectו-ProtoObjectלאקיימיםvariables ג. ד. ה. תשובתכם את הסבירו הבאות? הקריאות יחזירו מה 3 hasthesameinstvariables Class hasthesameinstvariables Object hasthesameinstvariables 2112 חורף 6 236703 עצמים מונחה תכנות
רשמי: פתרון שאלה 0 א. ע"י הוירטואלי האב יאותחל כל שקודם מכתיב הבנייה אלגוריתם 415424. ידפיס הקוד המחלקה, בחתימת הסדר לפי מכן לאחר בבנאי(. סטטי קישור )בגלל 0 ולכן הדיפולטי הבנאי. 24 ידפיס ואז 4, שידפיס A את יאתחל B2 ואחריו 15, ידפיס B1 של בארגומנטים או הבנייה בסדר טעות כללו או בבנאי סטטי קישור ציינו שלא תשובות חלקי. ניקוד קיבלו הבנאים ב. ג. ד. של הבנאי לגוף מגיעים כאשר רק מתבצע בטבלה (השינוי בבנאי סטטי קישור בגלל שינוי, אין.)C חלקי. ניקוד קיבלו מספק הסבר כללו שלא תשובות הטבלאות. בשתי קודמותיה את דורסת C::f(int) המתודה 6666. ידפיס הקוד חלקי. ניקוד קיבלו טבלאות שתי שקיימות צוין לא שבהסבר או הסבר כללו שלא תשובות בהסתרה. מדובר שעתה כיוון 1626, ידפיס הקוד חלקי. ניקוד קיבלו הסתרה שקיימת במפורש ציינו שלא תשובות שאלה 0 א. ב. ג. ד. ה. ו. בתוך ביותר הבסיסיים המבנים שאחד מאחר מחלקות עבור variance מאפשרת אינה השפה שימושי. אינו עבורם variance ולכן וכתיבה, לקריאה ניתנים ושדות שדה, הוא מחלקה ממתודה חזרה כטיפוס משמש T ש- מכיוון,out T זה בטיפוס אך ממתודה, חזרה טיפוס של כפרמטר משמש אמנם T מהאפשרויות, אחת אף פרמטר. כטיפוס וגם readonly שדה כטיפוס גם מופיע פרמטר. כטיפוס משמש T ש מכיוון,in פרמטר(. )טיפוס in- כU חזרה(, )טיפוס כ-out מסומן להיות יכול T פרמטר(. כטיפוס וגם ממתודה חזרה כטיפוס משמש )T מהאפשרויות אחת אף.B שאלה 3 א. ל מוכרת אינה C.f(B) ש ומכיוון בבנאי, דינמי קישור בגלל C.f(A) C.f(A) חלקי. ניקוד קיבלו בבנאי דינמי קישור שיש בהסבר ציינו שלא תשובות.C.f(B) ע"י נדרסת B.f(B) ש מכיוון C.f(A) C.f(B) חלקי. ניקוד קיבלו מספק הסבר כללו שלא תשובות ב. 2112 חורף 7 236703 עצמים מונחה תכנות
סטטית. מקושרת B.f(B) ש מכיוון C.f(A) B.f(B) חלקי. ניקוד קיבלו JAVA ב סטטית מקושרות פרטיות שמתודות בהסבר ציינו שלא תשובות ג. ד. C. ע"י דריסה אין רגיל, באופן A.f(A) B.f(B) חלקי. ניקוד קיבלו מספק הסבר כללו שלא תשובות )באופן ריצה בזמן והמימוש סטטי( )באופן הקומפילציה בזמן נקבעת החתימה כי C.f(A) דינמי(. חלקי. ניקוד קיבלו והמימוש החתימה בחירת אופן לגבי פירטו שלא תשובות ה. ו. JAVA ב גישה הרשאות לצמצם ניתן לא תאימות, חוסר בגלל קומפילציה שגיאת זו אך תאימות, חוסר שיש שציינו תשובות חלקי. ניקוד קיבלו זאת ציינו שלא תשובות כן. גם חלקי ניקוד קיבלו לשגיאה ולא להסתרה מביאה שאלה 4 א. ב..type erasure היא זאת הצבה שמאפשרת התכונה קומפילציה, עובר הקוד הנכונה: ההשלמה IterableArray<A>(new B[5]) A() ב-java. array covariance עם בעיה היא גורם הזה שהקוד הבעיה נפוצות: שגיאות אלו שגיאות אומנם הזה מהסוג דברים מיניי כל או 4 בגודל מערך,null של העברה בכדי הקורס את ללמוד צריך לא )2( "מעניינות" לא הן )1( אבל ריצה זמן שגיאות הן עליהן. להעלות מהסוג: השלמה IterableArray<A>(new A[5]) B() ריצה. זמן לשגיאת גורמת לא כמובן מהסוג: השלמה IterableArray<B>(new B[5]) A() covariance )אין מתקמפלת לא שהיא מפני ריצה זמן לשגיאת גורמת לא כמובן.)templates של בטיפוסים ג. ד. הבעייה את פותרת אינה היא ב'. בסעיף שהוצגה הבעיה היא לפתור מנסה שאלעד הבעיה בג'אווה. new T[a.length] לבצע שאסור מפני הבעיה, את פותרת היא ב'. בסעיף שהוצגה הבעיה היא לפתור מנסה שאריאל הבעיה אליו להתייחסות מערך בתור ל-array התייחסות כל שינוי הם בקוד הנדרשים השינויים.ArrayList בתור 2112 חורף 8 236703 עצמים מונחה תכנות
שגיאות נפוצות בסעיפים ג' ו-ד': אין פה בעיית אבטחה או שיתוף רפרנסים מפני ש-ExtendedIterator מאפשר שינוי של מה שעושים עליו איטרציה ובפרט שינוי של המערך ולכן השיתוף הזה הוא בסדר. חריגה מגבולות המערך ייתן שגיאת זמן ריצה, אבל זאת שגיאה ברמה של מת"ם אשר לא מראה שלמדתם משהו במהלך הקורס. שאלה 5 השאלה מורכבת משני חלקים: א. העתקתאובייקטים)סעיפיםא'וב'( כפי שנלמד בכיתה למתודה postcopy ישנה התנהגות דיפולטית "ריקה" ועליה להידרס. אם המתודה לא נדרסת כאשר ישנו אובייקט כשדה של המחלקה הוא לא יועתק אלא רק יועתק מצביע אליו. קוד אשר מדגים את הבעייתיות: a := MyClass new. b := a copy. b addtocollection: 5. כעת ישנם שני אובייקטים מטיפוס MyClass ובאוסף של שניהם נשמר המספר 5. זוהי בעיה מכיוון שהתכוונו להוסיף את 5 לאוסף של b בלבד. מימוש של המתודה postcopy אשר פותר את הבעיה: postcopy x := x copy )1 )2 קוד זה מעתיק את x באמצעות מתודת copy אשר כבר ממומשת במחלקת.OrderedCollection טעויות נפוצות: כמעט כל הסטודנטים הבינו את הבעיה וכתבו דוגמא מתאימה. הרבה סטודנטים לא השתמשו במתודה copy של מחלקת OrderedCollection ומימשו את העתקת האוסף בעצם. הרבה סטודנטים לא מימשו השמה של ההעתק למשתנה x. שתי הטעויות הללו קיבלו ניקוד חלקי. ב. hasthesameinstvariables)סעיפיםג',ד'וה'( על מנת לפתור את חלק זה הייתם צריכים להכיר את מודל האובייקט של Squeak נלמד בכיתה ולהבין )לפחות( את הנקודות הבאות: אשר 1( מחלקת Object יורשת ממחלקת ProtoObject אשר יורשת מ-.nil 2( לכל מחלקה ב- Squeak ישנה מטה-מחלקה אשר עוקבת אחר עץ הירושה של המחלקה המקורית. 6( class ProtoObject יורשת ממחלקת Class אשר יורשת ממחלקות.Object ומ- ClassDescription, Behavior ClassDescription class, Behavior class, יורשת ממחלקות Class class )4.Class ולבסוף שוב ממחלקת Object class, ProtoObject class 9
למחלקות Class, ClassDescription ו- Behavior ישנם,instance variables למשל 'methoddict' אשר הוצג בכיתה. באם לא זכרתם את 'methoddict' יכולתם להניח )כמו שמספר סטודנטים עשו( כי על מנת לממש את מודל האובייקט של Squeak יש לשמות מצב, ומחלקות אלו אשר נמצאות בליבת המימוש של המודל ישמרו שדות על מנת לשמור את המצב. )5 המתודה 'hasthesameinstvariables' מחזירה ערך בוליאני אשר מעיד האם למחלקה ולמטה מחלקה שלה יש את אותם.instance variables המתודה 'allinstvarnames' מחזירה עבור מחלקה מסוימת מערך עם שמות הvariables instance אשר קיימים במחלקה או באבות הקדמונים שלה. 3 hasthesameinstvariables זורקת שגיאת doesnotunderstand מכיוון ש- 6 הינו אובייקט, לא מחלקה ולכן אינו יכול להבין למשל את הקריאה.'instVarNames' Object hasthesameinstvariables משווה בין ה- instance variables של מחלקת Object ואבותיה לאלה של מחלקת Object class ואבותיה, כמו שהוזכר בשאלה למחלקות Object ו- ProtoObject אין Object,instance variables.false ולכן הערך שיוחזר הינו,instance variables ולכן יש לו Class יורש מ- class Class hasthesameinstvariables מכיוון שמחלקת Class class יורשת לבסוף ממחלקת Class עלינו לבדוק האם בירושה עד מחלקת Class class, ClassDescription הירושה כוללת את מחלקות,instance variables קיימים Class class, Behavior class, Object class ואת מחלקת. ProtoObject class לכל המחלקות הללו לא קיימים instance variables כך שהמתודה hasthesameinstvariables מחזירה את הערך.true טעויות נפוצות: )1 )2 סטודנטים רבים לא הבינו שבסעיף c נזרק error וענו כי התשובה הינה ערך בוליאני. אם צורף הסבר מתאים, התקבל ניקוד חלקי. סטודנטים רבים לא זכרו את עץ הירושה ובפרט את העובדה ש- Behavior class יורשת ממחלקת.Object class תשובה נכונה ללא הסבר מתאים או הסבר מתאים עם תשובה לא נכונה זיכו בניקוד חלקי. 11