מאמר שני בסדרת מאמרים בנושא תכנות מונחה עצמים, והפעם - הורשה והיררכיה של מחלקות
1 of 2
Download to read offline
More Related Content
הורשה והיררכיה של מחלקות
1. הורשה והיררכיה של מחלקות
בדומה לחיים האמיתיים, בהם הורים מורישים תכונות מסוימות לילדיהם וילדים כפועל יוצא מכך יורשים תכונות אלו
מהוריהם, כך באופן דומה לגמרי מתרחשת הורשה עבור קוד תוכנה כאשר התכונות המועברות הן משתנים ופונקציות.
מחלקת ההורה ( )Base Classהיא שתוריש למחלקת הילד ( )Derived Classאת התכונות. ההורשה תתבצע באופן
ציבורי, פרטי או מוגן.
ראשית נעסוק בהורשה ציבורית. מבחינת כתיבה ההורשה תתבצע כך:
...{ .class DERIVED CLASS : public BASE CLASS
כפי שהזכרנו במאמר "תכנות מונחה עצמים - מחלקות", לכל מחלקה יש בנאי והורס ועל כן, גם לתתי מחלקות יהיו קיימים
אלמנטים אלו, שהרי אלו יעברו אליהן בהורשה.
נניח ובנינו מחלקה מסוג ,Robotוכל הרובוטים יודעים לבצע 2 פעולות: לחשב ולאכול. כמו כן, לכל רובוט יש שם, רמת
חוכמה והיכולת להיות שמח או עצוב. עם זאת, קיימים רובוטים בעלי תכונות ייחודיות המבדילות אותם מרובוטים אחרים.
2 R2Dלמשל, יודע לדבר ספרדית, לעומתו אופטימוס פריים יודע לשנות צורה.2 R2Dואופטימוס פריים אינם חולקים
תכונות אלו, אך הם כן חולקים את היכולת לבצע את הפעולות "חישוב" ו"אכילה" ולשניהם יש שם, רמת חוכמה והיכולת
להיות שמח או עצוב.
אם כן, כאן ניתן לראות בבירור את היופי שבהורשה.
אם נצטרך לבנות מחדש את המחלקה של כל סוג של רובוט עם שינויים קלים בתכונה כזו או אחרת, אותה תכונה הייחודית
לו, אנו נמצא את עצמנו במהרה משכפלים קטעי קוד ויוצרים קבצים עמוסים טקסט, דבר שבסופו של דבר יקשה עלינו
להתמצא ולסייר בקטע הקוד ובפרויקטים גדולים יותר, אף יהיה בזבזני מבחינת משאבי מערכת, עבודת מעבד ושימוש
בזיכרון.
בחזרה לדוגמה שלנו, היות וכבר יש בידנו מחלקה בשם ,Robotעל מנת להגדיר את המחלקות 2 R2Dואופטימוס פריים,
כל שעלינו לעשות יהיה להשתמש בתכונות ההורשה באופן הבא:
class R2D2: public Robot
:{ public
} ;"R2D2 () { cout << ּ R2D2 Robot Built
} ;"∾R2D2(){cout << ּ R2D2 Robot Destroyed
} ;"void SpeakSpanish () { cout << "asta – la – vista
2. וכנ"ל לגבי אופטימוס פריים. כך שבעצם יצרנו מחלקות חדשות שהתשתית שלהן היא מחלקה קיימת, מבלי לשכפל שורות,
ובכך שמרנו על יעילות, צמצום וקריאות הקוד.
מכאן שקיימת עדיפות עליונה לזהות את התכונות המשותפות ולהציג אותן במחלקת ההורה, כך שלא נצטרך לשכתב
שורות קוד עבור מחלקות ילד שיוצרו בהמשך.
נציין שמחלקת ההורה, ה – base classהיא איזשהו רעיון מופשט, ועל כן נקראת גם ,Abstract Date Type – ADTכך
שלעולם אנו לא באמת ניצור אובייקט מסוג ,Robotאלא תמיד רובוט מסוג מסוים, שהרי גם בחיים האמיתיים אנו לא
מתייחסים לבנאדם כאל צורת חיים אלא יורדים בדרגות ההיררכיה עד לרמת השם של האדם, אך אם נחשוב על הנושא
בצורה מבנית, נוכל לראות שאותו "יוסי" לדוגמא, משתייך למחלקה "גבר". אותו הגבר הוא תת מחלקה של "בן אדם" ואותו
בן אדם הוא תת מחלקה של "צורת חיים".
למחלקת "צורת חיים" יש גם תת מחלקה בשם "בעל חיים" ולה תת מחלקה בשם "יונק" שלה תת מחלקה בשם "כלב" ולה
תת מחלקה בשם "לברדור".
באופן דומה, אנו נרצה לייצר היררכית הורשה ברמת הקוד.
בחזרה לדוגמא שלנו, על מנת ליצור רובוט מסוג 2 R2Dבערימה ( ,)Free Storeאנו נבצע יצירת אובייקט כמו מקודם:
;)(2R2D2 * r2d2#1 = new R2D
מה שהרווחנו כאן היא היכולת לרשום את השורה ;)"1#2r2d2#1 SetName ("R2D
למרות שבהגדרת המחלקה 2 R2Dעצמה, כלל לא מופיעה הפונקציה SetNameוכנ"ל לגבי התכונה .Nameאלו תכונות
שיש לילד מעצם ההורשה מההורה.