ירושה לעומת הרכב
ירושה וקומפוזיציה הם שני מושגים חשובים שנמצאים ב-OOP (תכנות מונחה עצמים). במילים פשוטות, גם קומפוזיציה וגם ירושה עוסקים במתן מאפיינים או התנהגות נוספים לכיתה. ירושה היא היכולת של מחלקה לרשת מאפיינים והתנהגות ממחלקה אב על ידי הארכתה. מצד שני, קומפוזיציה היא היכולת של מחלקה להכיל אובייקטים ממחלקות שונות כנתוני חברים.
מהי ירושה?
כפי שהוזכר לעיל, Inheritance היא היכולת של מחלקה לרשת מאפיינים והתנהגות ממחלקה אב על ידי הארכתה.ירושה בעצם מספקת שימוש חוזר בקוד על ידי מתן אפשרות להרחבת מאפיינים והתנהגות של מחלקה קיימת על ידי מחלקה שהוגדרה לאחרונה. אם מחלקה א' מרחיבה את ב', אז מחלקה ב' נקראת כיתת האב (או כיתת העל) ומחלקה א' נקראת כיתת הילד (או מחלקה נגזרת/מחלקה משנה). בתרחיש לדוגמה זה, מחלקה A תירש את כל התכונות והשיטות הציבוריות והמוגנות של מחלקת העל (B). תת-המחלקה יכולה לעקוף (לספק פונקציונליות חדשה או מורחבת לשיטות) את ההתנהגות שעברה בירושה ממחלקת האב.
ירושה מייצגת מערכת יחסים "הוא-א" ב-OOP. זה בעצם אומר ש-A הוא גם B. במילים אחרות, B יכול להיות המחלקה עם תיאור כללי של ישות מסוימת בעולם האמיתי, אבל A מציין התמחות מסוימת. בבעיית תכנות בעולם האמיתי, ניתן להרחיב את מחלקת האדם ליצירת מחלקת העובד. זה נקרא התמחות. אבל אתה יכול גם ליצור תחילה את המחלקה Employee ולאחר מכן להכליל אותה גם למחלקה Person (כלומר.ה. הַכלָלָה). בדוגמה זו, לעובד יהיו כל המאפיינים וההתנהגות של האדם (כלומר, העובד הוא גם אדם) והוא עשוי להכיל גם פונקציונליות נוספת (לכן, אדם אינו עובד).
מה זה קומפוזיציה?
קומפוזיציה היא היכולת של מחלקה להכיל אובייקטים ממחלקות שונות כנתוני חברים. לדוגמה, מחלקה A יכולה להכיל אובייקט של מחלקה B כחבר. כאן, כל השיטות (או הפונקציות) הציבוריות המוגדרות ב-B יכולות להתבצע בתוך המחלקה A. Class A הופך למכולה, בעוד Class B הופך למחלקה המוכלת. הרכב מכונה גם Containership. בדוגמה זו, ניתן לומר שמחלקה A מורכבת ממחלקה B. ב-OOP, קומפוזיציה מייצגת קשר "יש-יש". חשוב לציין שלמרות שלמכל יש גישה להפעיל את כל השיטות הציבוריות של המחלקה הכלול, הוא אינו מסוגל לשנות או לספק פונקציונליות נוספת. כאשר מדובר בבעיית תכנות בעולם האמיתי, אובייקט של Class TextBox עשוי להיות כלול בכיתה Form, ולכן ניתן לומר ש-Form מכיל TextBox (או לחילופין, Form מורכב מ-TextBox).
מה ההבדל בין ירושה להרכב?
למרות שירושה וקומפוזיציה הם שני מושגי OOP, הם שונים לגמרי במה שהם מאפשרים למתכנת להשיג. ירושה היא היכולת של מחלקה לרשת מאפיינים והתנהגות ממחלקת אב על ידי הארכתה, בעוד קומפוזיציה היא היכולת של מחלקה להכיל אובייקטים ממחלקות שונות כנתוני חבר. אם מחלקה מורחבת, היא יורשת את כל המאפיינים/ההתנהגות הציבוריים והמוגנים וההתנהגויות הללו עשויות להידרס על ידי תת המחלקה. אבל אם מחלקה מוכלת באחר, המכולה לא מקבל את היכולת לשנות או להוסיף התנהגות למכיל. ירושה מייצגת מערכת יחסים "is-a" ב-OOP, ואילו קומפוזיציה מייצגת קשר "יש-a".