On this page
מערך שיעור: 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 |
| 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(); — שורה אחת, בלי לדעת כלל אילו טיפוסים בפנים. ההבדל בקיצור ובעמידות לשינוי עתידי (הוספת צורה חדשה) הוא כל הסיפור.