290 likes | 431 Views
שעור אחרון עם הכלבים. public class RobDog extends Dog. אוסף הכלבים. תפריט הרובוטים. אוסף הרובוטים. תפריט הכלבים. לכל ביטוי בשפה (טבעית או פורמאלית) ניתן להתייחס בשני אופנים: תחבירי ותוכני. היום יום שבת. הוא משפט נכון מבחינה תחבירית ולא נכון מבחינה תוכנית.
E N D
public class RobDog extends Dog אוסף הכלבים תפריט הרובוטים אוסף הרובוטים תפריט הכלבים
לכל ביטוי בשפה (טבעית או פורמאלית) ניתן להתייחס בשני אופנים: תחבירי ותוכני. היום יום שבת. הוא משפט נכון מבחינה תחבירית ולא נכון מבחינה תוכנית. השעור הנוכחי הוא על המתח הזה שבין התוכן לתחביר.
בהינתן ביטוי בשפת תכנות השאלה התחבירית היא: האם הביטוי חוקי כלומר האם הוא יהודר (יעבור קומפילציה) השאלה התוכנית היא: מה הביטוי הזה יעשה כשהתוכנית תרוץ. כמו במקרה של השפה הטבעית התשובות לשתי השאלות האלו עשויות שלא לעלות בדיוק בקנה אחד.
הביטוי RobDog my_dog= new Dog(); לא יהודר. הוא מבטיח דבר שאי אפשר לקיימו - שלכל שיטה x(…) בתפריט של RobDog הביטוי my_dog.x(…) ניתן לבצוע.
לעומת זאת הביטוי Dog my_dog= new RobDog(); יהודר. הוא מבטיח דבר שאפשר לקיימו – שכן כל שיטה x(…) בתפריט של Dog מופיעה בתפריט של RobDog
האם הביטוי יהודר? my_dog.voice(2,20);
המשתנה my_dog הוא מטפוס Dog ובתפריט של Dog אין שיטה voice(int,int)
האם הביטוי יהודר? my_dog.voice(2);
המשתנה my_dog הוא מטפוס Dog ובתפריט של Dog יש שיטה voice(int)
מה יהיה הפלט של הביטוי my_dog.voice(2)
כלל ההפניה: השיטה אליה אנו פונים היא היא תמיד השיטה היורשת ולא המורישה.
העצם "אינו יודע" איזה טפוס משתנה הפנה אותנו אליו
כלל התפריט: חוקיות הביטוי נקבעת על פי התפריט של השיטה המורישה
המהדר אינו יכל לדעת אל איזה עצם מפנה המשתנה
באמצעות מנגנון ההשלכה ניתן להתעקש, לומר למהדר שאיננו זקוקים להגנתו
פלט The robot dog called dog_number0: TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTO O TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOO TOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO T OOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTOO TOOTO O TOOTOO TOOTOO TOOTOO TOOTOO
מה יקרה עכשיו? Dog your_dog = new Dog(); ((RobDog) your_dog).voice(3,5);
ועכשיו? Pack p = new Pack(“River”); ((RobDog) p).voice();
נוסיף למחלקה Pack את השיטה public Dog member_at(int i) { return members[i]; }
נקים להקת כלבים ונצרף אליה מספר כלבים ורובוטי כלבים public class Pack_driver { public static void main(String[] args) { Pack mixed_pack = new Pack(“mixed”); mixed_pack.add_member(new Dog(“Rex”)); mixed_pack.add_member(new RobDog(“RobRex”)); mixed_pack.add_member(new Dog(“Mitzi”)); mixed_pack.add_member(new RobDog(“RobMitzi”)); for (idog = 0; idog<mixed_pack.size(); idog++{ mixed_pack.member_at(idog).voice(); } } }
public class Pack_driver { public static void main(String[] args) { Pack mixed_pack = new Pack(“mixed”); mixed_pack.add_member(new Dog(“Rex”)); mixed_pack.add_member(new RobDog(“RobRex”)); mixed_pack.add_member(new Dog(“Mitzi”)); mixed_pack.add_member(new RobDog(“RobMitzi”)); for (idog = 0; idog<mixed_pack.size(); idog++{ mixed_pack.member_at(idog).voice(); } } }
public class Pack_driver { public static void main(String[] args) { Pack mixed_pack = new Pack(“mixed”); mixed_pack.add_member(new Dog(“Rex”)); mixed_pack.add_member(new RobDog(“RobRex”)); mixed_pack.add_member(new Dog(“Mitzi”)); mixed_pack.add_member(new RobDog(“RobMitzi”)); for (idog = 0; idog<mixed_pack.size(); idog++{ mixed_pack.member_at(idog).voice(); } } }
public class Pack_driver { public static void main(String[] args) { Pack mixed_pack = new Pack(“mixed”); mixed_pack.add_member(new Dog(“Rex”)); mixed_pack.add_member(new RobDog(“RobRex”)); mixed_pack.add_member(new Dog(“Mitzi”)); mixed_pack.add_member(new RobDog(“RobMitzi”)); for (idog = 0; idog<mixed_pack.size(); idog++{ mixed_pack.member_at(idog).voice(); } } }
public class Pack_driver { public static void main(String[] args) { Pack mixed_pack = new Pack(“mixed”); mixed_pack.add_member(new Dog(“Rex”)); mixed_pack.add_member(new RobDog(“RobRex”)); mixed_pack.add_member(new Dog(“Mitzi”)); mixed_pack.add_member(new RobDog(“RobMitzi”)); for (idog = 0; idog<mixed_pack.size(); idog++({ mixed_pack.member_at(idog).voice(); } } }
פלט The dog called Rex: HAAU The robot dog called RobRex: TOOTOO The dog called Mitzi: HAAU The robot dog called RobMitzi: TOOTOO
לתופעה זו, שלמשתנים מאותו טיפוס יכולות להיות התנהגויות שונות, קוראים רב צורתיות (פולימורפיזם).