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

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

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

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


מהלך השיעור

חלק בשיעורמשךהערות ודגשים
פתיחה וחיבור5 דקותשאלו: “מה זה בכלל ‘צורה’ בלי להיות עיגול/מלבן/משהו קונקרטי?”
הבעיה: מופע חסר-משמעות10 דקותnew Shape() — מה השטח שלו? אין תשובה הגיונית
הרעיון: abstract20 דקותabstract class + abstract method, הדגימו שגיאת new
virtual מול abstract10 דקותטבלת השוואה קצרה — אופציונלי מול חובה
פולימורפיזם20 דקותList עם כמה תתי-טיפוסים, foreach אחד
sealed10 דקותעצירת ירושה נוספת, דוגמה קצרה
תרגול מודרך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(); — שורה אחת, בלי לדעת כלל אילו טיפוסים בפנים. ההבדל בקיצור ובעמידות לשינוי עתידי (הוספת צורה חדשה) הוא כל הסיפור.