# מערך שיעור: ירושה — virtual ו-override📋 מערך מרצה

משך: 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/override | 20 דקות | 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` שמסנכרן את שניהם יחד — והראו כמה זה מסורבל ושביר, כהדגמה חיה לדילמה שדיברתם עליה.
