תכנות מונחה עצמים ועיצוב
דומיין זה בודק תכנון מונחה עצמים: כיתה, אובייקט, כמוסות, ירושה, רב-צורתיות וממשקים. בבגרות נדרשים גם לקרוא תרשים מחלקות, לזהות קשרי ירושה והרכבה, ולהסביר מדוע עיצוב מסוים עדיף.
עקרונות
- כיתה היא תבנית; אובייקט הוא מופע עם מצב משלו.
- כמוסות: שדות private, גישה דרך מתודות; שומרים על אינווריאנטה של האובייקט.
- ירושה: extends מבטא is-a; הרכבה מבטאת has-a וגמישה יותר.
- רב-צורתיות: משתנה מטיפוס בסיס יכול להצביע לאובייקט נגזר, והמתודה שמתבצעת נקבעת בזמן ריצה לפי הטיפוס בפועל.
- מחלקה מופשטת יכולה להכיל מימוש חלקי; ממשק מגדיר חוזה.
- overloading הוא אותו שם עם חתימה שונה; overriding הוא דריסה של מתודה תורשתית.
דוגמה מעובדת
מחלקה מופשטת Shape עם area(). Circle מחזירה Math.PIrr ו-Rectangle מחזירה w*h. מערך Shape[] shapes = {new Circle(2), new Rectangle(3,4)}; מעבר על המערך וקריאה ל-shapes[i].area() יפעיל את המימוש המתאים לכל אובייקט. הנימוק: ההחלטה אינה לפי טיפוס המשתנה Shape אלא לפי האובייקט שנבנה בפועל, וזו רב-צורתיות.
מלכודות
- חשיפת שדות ציבוריים ושימוש ישיר בהם במקום מתודות.
- בלבול בין overloading ל-overriding.
- קריאה למתודה שנדרסה מתוך בנאי המחלקה האב לפני שהאובייקט הנגזר אותחל.
- שכחת super() או אי-אתחול שדות.
- שימוש בירושה כשיש קשר has-a, מה שיוצר שבירות.