משך: 2 שעות אקדמיות (90 דקות).

מטרת השיעור: הסטודנטים יבינו מתי ירושה מתאימה, וישתמשו נכון ב-virtual/override/base.

בסוף השיעור הסטודנטים צריכים: להגדיר היררכיית ירושה פשוטה, לשכתב מתודה עם override, ולהשתמש ב-base גם בקונסטרוקטור וגם במתודה.

דגש קריטי: הדגישו את מבחן “הוא-סוג-של” (is-a) לזיהוי מתי ירושה מתאימה — Manager הוא-סוג-של Employee; Car הוא לא סוג-של Engine.


מהלך השיעור

חלק בשיעורמשךהערות ודגשים
פתיחה וחיבור5 דקותהראו קוד עם Employee ו-Manager שמשכפל את כל השדות
הבעיה: כפילות קוד10 דקות“מה קורה אם צריך להוסיף שדה ל-Employee? כמה מקומות לעדכן?”
הרעיון: ירושה15 דקותclass Manager : Employee, קבלת שדות אוטומטית
base בקונסטרוקטור15 דקותהראו שגיאה בלי base(…), ואז עם
virtual/override20 דקותDescribe בדוגמה, הדגישו שבלי virtual אי אפשר לשכתב
base במתודה10 דקותהראו הרחבה של ההתנהגות במקום שכתוב מלא
תרגול מודרך15 דקותתרגיל 1+2

דגשים להעברת השיעור

  • מבחן “הוא-סוג-של” הוא הכלי המעשי ביותר להחליט מתי ירושה מתאימה — תרגלו אותו על כמה דוגמאות טובות ורעות בכיתה (Dog:Animal טוב; Car:Engine רע).
  • אל תתנו לירושה להיראות “בחינם” — ציינו בקצרה (בלי להעמיק) שירושה עמוקה מדי היא bad smell נפוץ, ושבהמשך הקורס (SOLID) יידונו חלופות.
  • הדגמה חיה של שגיאת קומפילציה כשמנסים override בלי virtual משאירה רושם חזק מאוד.

מושגים

Base Class — המחלקה שממנה יורשים. Derived Class — המחלקה שיורשת. virtual — מסמן מתודה כניתנת לשכתוב. override — שכתוב מתודה virtual במחלקה יורשת. base — גישה למימוש/קונסטרוקטור של מחלקת הבסיס.


תרגיל חשיבה

שאלת פתיחה: “האם Square (ריבוע) צריך לרשת מ-Rectangle (מלבן)? מה יכול להשתבש?”

מהלך: שאלה קלאסית ב-OOP. תנו לסטודנטים לחשוב — מתמטית ריבוע הוא מלבן מיוחד, אבל אם Rectangle חושפת Width/Height נפרדים שאפשר לשנות באופן עצמאי, Square שיורש ממנה “שובר” את האילוץ שרוחב=גובה. זו דוגמה מצוינת לכך ש"הוא-סוג-של" מתמטי לא תמיד = “הוא-סוג-של” תכנותי טוב.

מה המרצה מראה בסוף: אם יש זמן, ממשו בקצרה Square : Rectangle עם override ל-Width/Height שמסנכרן את שניהם יחד — והראו כמה זה מסורבל ושביר, כהדגמה חיה לדילמה שדיברתם עליה.