הערות על הבוחן
( מבוא לעצמים.כולל. הבוחן כולל את כל החומר שנלמד בקורס עד )1 נכללת בחומר לבוחןאינה הורשה
. הבוחן כולל את החומר שנלמד בתרגילים את הפרקים א-ז בספר "פרקי מבוא2 במדעי המחשב" ואת כל החומר הרלבנטי באתרים של המורים השונים.
. מומלץ לעיין בבוחן של שנה שעברה. מתכונת הבוחן השנה תהיה דומה. 3 כל נבחן יקבל:
. אחדא. חוברת שאלות שאליה מצורף דף תשובות .לטיוטה בלבד ב. חוברת בחינה שתשמש
בסוף הבוחן יאספו רק דפי התשובות. תשובות במחברת הטיוטה לא יקראו.. המקום בדף התשובות הוקצה בנדיבות. אם תשובתכם ארוכה מכדי להיכנס במקום4
שהוקצה לה, היא כנראה לא נכונה.
יענו על שאלות כדי שלא להעניק יתרון בלתי הוגן לא . בזמן הבוחן המורים 3
עברית לחלק קטן מהסטודנטים. סטודנטים החוששים שיפגעו בגלל אי ידיעת מתבקשים לגשת אל אחד המרצים לפני הבוחן.
לאור הצלחתנו לדמות כלב. קיבלנו משימה חדשהRobDogלדמות רובוט של כלב באמצעות המחלקה
הרובוט דומה להפליא לכלב להוציא מספר הבדלים דקים:
א. במקום בשר הרובוט אוכל סוללות..tootooב. במקום לנבוח הוא שורק
ג. הוא יודע קצת חשבון.
במבט ראשון נראה שעלינו לחזור על כל התהליך מההתחלה עניין מיגע למדי.
הדרך הקלה )ולכן הנכונה( לעשות זאת היא באמצעות מנגנון ההורשה (inheritance).
. Dog את המחלקה תירש RobDogהמחלקה
public class RobDog extends Dog {}
ההגדרה
יוצרת מחלקה חדשה.RobDog.javaבקובץ
Dog.המשתנים והשיטות הפומביות שלה זהים לאלו של
. Dog ירשה אותם מהמחלקה RobDogאנו אומרים שהמחלקה
.עוד נורש באופן אוטומטי הבונה הריק
public class RobDog_driver1 { public static void main)String[] args( { RobDog canis = new RobDog)(; RobDog canis1; canis1 = change_name)canis,"Tushtush"(; canis.voice)(; canis1.voice)(; System.out.println)canis == canis1(; } public static RobDog change_name)RobDog to_change, String new_name( { to_change.set_name)new_name(; return to_change; }}
פלט
The dog called Tushtush: HAAUThe dog called Tushtush: HAAUtrue
עם זאת, שלמחוץ לכמוסהחשוב לזכור שהמחלקה היורשת נמצאת
המחלקה המורישה.
שיטה חדשה RobDog להגדיר ב אי אפשר
public void set_name_to_peng)( { name = “peng”;}
חייבים לעבור - Dog nameכדי לשנות את המשתנה הפרטי של . set_name הציבורית דרך השיטה
public void set_name_to_peng)( { set_name)“peng”(;}
אנחנו כמובן לא מסתפקים בבונה אחד
public RobDog)String name, int mood( { super)name,mood(;}public RobDog)String name({ super)name(; }
public RobDog)({ super)(;}
ולמען השלמות
public RobDog)String name, int mood( { super)name,mood(;}public RobDog)String name({ super)name(; }public RobDog)({ super)(;}
)…(superשימו לב לשמוש ב המאפשר לנו לפנות אל בונה של
. Dogמחלקת האם
)…(this ל שימו גם לב שבדומהsuper )…(חיב להופיע בשורה ה
ראשונה.
.Dog כמעט זהה למחלקה RobDogבשלב זה המחלקה נתחיל לשנות אותה כך, שהעצמים יהיו רובוטים כלביים ולא כלבים ממש.
שלב א. שינוי הקולות קבוע מחרוזת חדש עבור השריקות של הרובוט. RobDogנגדיר ב
כך שתשרוק במקום לנבוח. voiceונשנה את השיטה .(overriding)דריסה לשינוי כזה בשיטה של מחלקה יורשת קוראים
public static final String WHISTLE = “TOOTOO”;
מ )voice)intלכאורה מספיק להעתיק את השיטה ולשנות מלה אחת RobDog למחלקה Dogהמחלקה
public void voice)int n_sounds( { String sound; int sound_counter; if )n_sounds <= 0 ( { System.out.println)"Error in Dog.voice: "+ "Cannot produce zero or fewer sounds"(; return; } if )mood == HAPPY( sound = WHISTLE; else if )mood == SAD( sound = HOWL; else sound = "Unknown mood "+mood; System.out.print)this+": "(; for )sound_counter = 0; sound_counter< n_sounds; sound_counter++( System.out.print)sound+" "(; System.out.println)(; }
אולם אז נכפיל את מספר שורות הקוד )ואת הסיכויים לטעות(.
.voice יותר על כללית להעמיס שיטה נוספת Dogמוטב במחלקה
public void voice)int n_sounds, String happy_sound,String sad_sound(
public void voice)int n_sounds,String happy_sound,String sad_sound( { String sound; int sound_counter; if )n_sounds <= 0 ( { System.out.println)"Error in Dog.voice: "+ "Cannot produce zero or fewer sounds"(; return; } if )mood == HAPPY( sound =happy_sound; else if )mood == SAD( sound = sad_sound; else sound = "Unknown mood "+mood; System.out.print)this+": "(; for )sound_counter = 0; sound_counter< n_sounds; sound_counter++( System.out.print)sound+" "(; System.out.println)(; }
Dog במחלקה )voice )intעכשיו נכתוב מחדש את
public void voice)int n_sounds( { voice)n_sounds,BARK,HOWL(;}
.RobDogונכתוב בקלות את השיטה הדורסת במחלקה
public void voice)int n_sounds( { voice)n_sounds,WHISTLE,HOWL(;}
שימו לב Dog במחלקה )(voiceאין צורך לכתוב מחדש את השיטה
ואין צורך לדרוס אותה
voiceהבקיאות של הרובוט שלנו בחשבון מתבטאת בהעמסה נוספת של RobDogשקימת רק ב
public void voice)int n, int m( { voice)n*m(;}
.)(toStringשלב ב. נדרוס את
public String toString)( { return "The robot dog called "+get_name)(; }
שלב ג. נשנה את סוג המזון החביב על הרובוטים. שיטה חדשה Dogלשם כך צריך להגדיר ב
public void set_eats)String food( { eats = food;}
:RobDogונשנה מעט את הבונים של
public RobDog)String name, int mood( { super)name,mood(; set_eats)“battery ”(;}
public RobDog)String name({ super)name(; set_eats)“battery ”(; }
public RobDog)({ super)(; set_eats)“battery ”(;}
- הרובוט רוצה להתחזות לדבר האמיתיsuperשימוש נוסף ב
RobDogנגדיר במחלקה
public void pretend_to_be_a_dog)int n( { super.voice)n(;}
Public class RobDog_driver { public static void main)String[] args( { RobDog rob = new RobDog)(;
rob.voice)2,2(; rob.eat)“meat”(;
rob.voice)2,3(; rob.eat)“battery”(; rob.voice)2,4(;
rob.pretend_to_be_a_dog)3(; } }
The robot dog called dog_number0: TOOTOO TOOTOO TOOTOO TOOTOOThe robot dog called dog_number0: OOOOOO OOOOOO OOOOOO OOOOOO OOOOOO OOOOOOThe robot dog called dog_number0: TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOOThe robot dog called dog_number0: HAAU HAAU HAAU
The robot dog called dog_number0: TOOTOO TOOTOO TOOTOO TOOTOOThe robot dog called dog_number0: OOOOOO OOOOOO OOOOOO OOOOOO OOOOOO OOOOOOThe robot dog called dog_number0: TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOOThe robot dog called dog_number0: HAAU HAAU HAAU
פלט
כעת מבקשים מאתנו חתול
Catמבחינות רבות חתול דומה לכלב ולא נרצה לכתוב את המחלקה מההתחלה.
. Dog לא יכולה לרשת את המחלקה Catמצד שני המחלקה .set_pack תהיה שיטה Catלמשל, אין הגיון שבתפריט של
)חתולים לעולם אינם מתארגנים בלהקות(
( abstraction)המהלך הנדרש מאתנו הוא הפשטה עלינו לזהות את המהות המופשטת, שמאחורי שני הטיפוסים
המוחשיים: כלב ו חתול - שניהם יונקים.
תכיל לכן חלק ניכר מהקוד שהופיע קודם Mammal המחלקה . Dogב מחלקה
Public class Dog extends Mammal תהפוך להיות Dogהמחלקה
Public class Cat extends Mammal תיכתב כ Catוהמחלקה
ומה באשר לתרנגולת?
ככל שנמשיך בפרויקט ילך ויבנה עץ ההורשה
Organism
Animal Plant Archeon Microbe
ReptileMammal Bird Fish
Cat Dog
Insect
RobDog
Chicken
)כמעט( כל המחלקות יורשות. Javaב Objectאם אין למחלקה מחלקת אם מפורשת – מחלקת האם שלה היא