אתם מתרגלים שאלה מתוך מה"ט מבני נתונים ותכנות מונחה עצמים — הנדסאי תוכנהמבחן 2022 · אביב מועד ב · שאלה 5כל שאלות המבחן ←
תכנות מונחה עצמיםממשקים

נתונה היררכיית מחלקות: שלוש מחלקות Kid, Student, Worker ושלושה ממשקים ICanRead, ICanWrite, ICanSpeak. Kid ממשת ICanSpeak; Worker ממשת ICanRead ו-ICanSpeak; Student יורשת מ-Kid וממשת ICanWrite (וגם ICanRead — נדרש לתקינות הקוד בסעיף ב', ראו contentIssues). בכל מחלקה מוגדרת פעולה בונה ללא פרמטרים.

תרשים UML נתון (עמוד 8 java / עמוד 23 csharp): שלושה ממשקים בשורה עליונה (ICanWrite{write()}, ICanRead{read()}, ICanSpeak{speak()}), מתחתם Kid{speak(),eat()} ו-Worker{read(),speak()}, ומתחת Student{write(),read(),sleep()}. חץ מלא (ירושה) מ-Student ל-Kid. חיצי מקווקו (מימוש ממשק) — הוסקו מהתרשים וממה שנדרש כדי שקטע הקוד בסעיף ב' יעבור קומפילציה: Kid⇢ICanSpeak; Worker⇢ICanRead, Worker⇢ICanSpeak; Student⇢ICanWrite. הקשר 'Student⇢ICanRead' (בנוסף לירושה מ-Kid) אינו ודאי-חד-משמעי מהתרשים המצויר בלבד, אך הוא הכרחי כדי שהשורה z.read() בסעיף ב' תתקמפל כאשר z מוצהר מטיפוס משותף ל-Student ול-Worker (הממשק המשותף היחיד שיש בו read() הוא ICanRead) — ראו contentIssues.

ICanWrite{write()}   ICanRead{read()}   ICanSpeak{speak()}
     ▲                    ▲  ▲                ▲   ▲
     |                    |   \--(Worker)      |   |
  (Student)             (Student?)         (Kid)  (Worker)

Student --ירושה--> Kid
Kid{speak(),eat()}      Worker{read(),speak()}
Student{write(),read(),sleep()}
סעיף א

לכל אחת מהמחלקות Kid, Student, Worker כתבו את כותרת המחלקה.

class Kid implements ICanSpeak class Worker implements ICanRead, ICanSpeak class Student extends Kid implements ICanWrite, ICanRead

סעיף ב

השלימו את שלוש השורות (1)-(3) כך שקטע קוד שלפניכם יעבור בלי שגיאות קומפילציה וזמן ריצה: _(1) x = new Worker(); _(2) y = new Kid(); _(3) z = new Student(); x = y; y = new Student(); y.eat(); z.read(); ((Student)z).speak(); ((Kid)z).eat(); z = new Worker();

סעיף ג

כתבו פעולה המקבלת כפרמטר מערך מטיפוס ICanSpeak. הפעולה תעבור על איברי המערך ותקרא לפעולה write(), אם היא קיימת בעבור העצם. אם הפעולה write() אינה קיימת – תיקרא הפעולה speak().

public static void writeOrSpeak(ICanSpeak[] arr)

שאלות ותגובות על השאלה

🎓 לא הבנתם משהו? קבלו הסבר נוסף ממרצה לתכנות

שאלו כאן — ותקבלו מענה מוסמך.

🎓 מרצה לתכנות עונה כאן — תקבלו מענה מקצועי