הערות על הבוחן 1. הבוחן כולל את כל החומר שנלמד בקורס עד (...

Preview:

DESCRIPTION

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

Citation preview

הערות על הבוחן

( מבוא לעצמים.כולל. הבוחן כולל את כל החומר שנלמד בקורס עד )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אם אין למחלקה מחלקת אם מפורשת – מחלקת האם שלה היא

Recommended