# מערך שיעור: Generics📋 מערך מרצה

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

מטרת השיעור: הסטודנטים יבינו למה `List<T>`/`Dictionary<TKey,TValue>` עובדים על כל טיפוס, ויכתבו מחלקה Generic משלהם.

בסוף השיעור הסטודנטים צריכים: להסביר למה `T` שומר Type Safety בעוד `object` מאבד אותה, לכתוב מחלקה/מתודה Generic פשוטה, ולהשתמש ב-`where` constraint בסיסי.

דגש קריטי: הסטודנטים כבר משתמשים ב-`List<T>` שבועות ארוכים — נצלו את זה: "אתם כבר יודעים להשתמש ב-Generics, היום לומדים איך לכתוב כאלה בעצמכם".

---

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

| חלק בשיעור | משך | הערות ודגשים |
| --- | --- | --- |
| פתיחה וחיבור | 5 דקות | הזכירו: "List<int>, List<string>, List<Student> — אותו קוד בדיוק. איך?" |
| הבעיה: שכפול קוד לכל טיפוס | 10 דקות | הראו IntStack/StringStack עם קוד זהה — כפילות בוטה |
| הרעיון: T כ-placeholder | 15 דקות | Box<T> — מחלקה אחת, כמה שימושים |
| Type Safety מול object | 15 דקות | השוו Box<T> ל-Box עם object — הראו קריסת casting אפשרית |
| Dictionary<TKey,TValue> | 15 דקות | שני Type Parameters, שימוש מעשי |
| where constraint | 15 דקות | FindMax<T>, קישרו ל-IComparable שכבר מוכר |
| תרגול מודרך | 15 דקות | תרגיל 1+2 |

---

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

- הקישור ל-`List<T>`/`Dictionary` שכבר מוכרים הוא נקודת המפתח — סטודנטים "כבר יודעים" להשתמש בזה, היום רק פותחים את הקופסה השחורה.
- ההשוואה ל-`object` (איבוד Type Safety) היא ההוכחה הכי משכנעת ל"למה Generics ולא סתם object לכל דבר" — הדגימו קריסת casting בפועל אם יש זמן.
- `where` constraint מספיק להראות בדוגמה אחת פשוטה (`IComparable<T>`) — אין צורך בכל הסוגים האפשריים של constraints בשלב הזה.

---

## מושגים

**`T` (Type Parameter)** — placeholder לטיפוס, נקבע בשימוש קונקרטי.
**Generic Class/Method** — מוגדרים עם `<T>`, עובדים על כל טיפוס תואם.
**Type Safety** — בדיקת טיפוסים בקומפילציה, נשמרת גם עם Generics.
**`where` constraint** — מגביל אילו טיפוסים מותר להשתמש כ-`T`.

---

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

**שאלת פתיחה:** "בלי Generics, כמה מחלקות `Stack` שונות הייתם צריכים כדי לתמוך ב-int, string, ו-Student? מה קורה כשמוסיפים טיפוס רביעי?"

**מהלך:** תנו לסטודנטים לחשב — 3 מחלקות זהות פרט לשם הטיפוס, וטיפוס רביעי דורש מחלקה רביעית זהה. הובילו לתובנה: זו בדיוק אותה בעיה שפונקציות פתרו (כפילות קוד) — רק ברמת **טיפוסים** במקום ברמת לוגיקה.

**מה המרצה מראה בסוף:** כתבו `Box<T>` פעם אחת, והשתמשו בה עם 3 טיפוסים שונים (`int`, `string`, `Student` מהיחידה הקודמת) בלי לשנות אף שורה במחלקה עצמה. הניגוד מול "3 מחלקות זהות" שדיברתם עליו בפתיחה הוא כל הסיפור.
