# מערך שיעור: Abstract, sealed ופולימורפיזם📋 מערך מרצה

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

מטרת השיעור: הסטודנטים יבינו למה `abstract` שונה מ-`virtual` רגיל, ויראו פולימורפיזם בפעולה על `List` משותפת.

בסוף השיעור הסטודנטים צריכים: להגדיר `abstract class` עם `abstract` method, להסביר למה `new` על מחלקה abstract לא חוקי, ולהדגים פולימורפיזם על אוסף עם כמה תתי-טיפוסים.

דגש קריטי: הרגע החשוב ביותר בשיעור הוא ה-`foreach` על `List<Shape>` שמכיל כמה סוגי צורות שונים — זה הרגע שבו "פולימורפיזם" הופך ממושג מופשט לתופעה נראית-לעין.

---

## מהלך השיעור

| חלק בשיעור | משך | הערות ודגשים |
| --- | --- | --- |
| פתיחה וחיבור | 5 דקות | שאלו: "מה זה בכלל 'צורה' בלי להיות עיגול/מלבן/משהו קונקרטי?" |
| הבעיה: מופע חסר-משמעות | 10 דקות | `new Shape()` — מה השטח שלו? אין תשובה הגיונית |
| הרעיון: abstract | 20 דקות | abstract class + abstract method, הדגימו שגיאת new |
| virtual מול abstract | 10 דקות | טבלת השוואה קצרה — אופציונלי מול חובה |
| פולימורפיזם | 20 דקות | List<Shape> עם כמה תתי-טיפוסים, foreach אחד |
| sealed | 10 דקות | עצירת ירושה נוספת, דוגמה קצרה |
| תרגול מודרך | 15 דקות | תרגיל 1+2 |

---

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

- וודאו שההבדל בין `virtual` (מהשיעור הקודם) ל-`abstract` (כאן) ברור לגמרי — טבלת השוואה קצרה על הלוח עוזרת: "virtual = ברירת מחדל אופציונלית לשכתוב; abstract = אין ברירת מחדל, חובה לממש".
- ה-`foreach` על `List<Shape>` הוא הרגע ה"וואו" של השיעור — תנו לו זמן, אל תמהרו הלאה מיד.
- `sealed` מספיק להראות בקצרה — זו לא הנקודה המרכזית של השיעור, רק כלי נוסף שכדאי להכיר.

---

## מושגים

**`abstract class`** — מחלקה שלא ניתן ליצור ממנה מופע ישירות.
**`abstract` method** — מתודה בלי גוף; חובה לממש בכל יורש קונקרטי.
**`sealed`** — עוצר ירושה/override נוספים.
**Polymorphism** — אותה קריאה מתנהגת אחרת לפי הטיפוס האמיתי בזמן ריצה.

---

## תרגיל חשיבה

**שאלת פתיחה:** "יש לכם `List<Shape>` עם 100 צורות מעורבבות — עיגולים, מלבנים, משולשים. אתם רוצים להדפיס את השטח של כולן. בלי abstract/פולימורפיזם, איך הייתם עושים את זה?"

**מהלך:** תנו לסטודנטים להציע פתרון — לרוב יגיעו ל"`if`/`switch` לפי סוג הצורה בכל איטרציה". הובילו לתובנה: הפתרון הזה **שביר** — כל צורה חדשה דורשת לחזור ולתקן את הלולאה עצמה. פולימורפיזם הופך את זה למיותר לגמרי — הלולאה לא צריכה לדעת בכלל אילו סוגי צורות קיימים.

**מה המרצה מראה בסוף:** כתבו קודם גרסה עם `switch` על `shape.GetType()` בתוך הלולאה (מסורבל, שביר). מיד אחר כך, אותה משימה בדיוק עם `foreach (Shape s in shapes) s.PrintArea();` — שורה אחת, בלי לדעת כלל אילו טיפוסים בפנים. ההבדל בקיצור ובעמידות לשינוי עתידי (הוספת צורה חדשה) הוא כל הסיפור.
