ݺߣ

ݺߣShare a Scribd company logo
‫הורשה והיררכיה של מחלקות‬

    ‫בדומה לחיים האמיתיים, בהם הורים מורישים תכונות מסוימות לילדיהם וילדים כפועל יוצא מכך יורשים תכונות אלו‬
   ‫מהוריהם, כך באופן דומה לגמרי מתרחשת הורשה עבור קוד תוכנה כאשר התכונות המועברות הן משתנים ופונקציות.‬

      ‫מחלקת ההורה (‪ )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‬‬
‫וכנ"ל לגבי אופטימוס פריים. כך שבעצם יצרנו מחלקות חדשות שהתשתית שלהן היא מחלקה קיימת, מבלי לשכפל שורות,‬
                                                                 ‫ובכך שמרנו על יעילות, צמצום וקריאות הקוד.‬

     ‫מכאן שקיימת עדיפות עליונה לזהות את התכונות המשותפות ולהציג אותן במחלקת ההורה, כך שלא נצטרך לשכתב‬
                                                                 ‫שורות קוד עבור מחלקות ילד שיוצרו בהמשך.‬

   ‫נציין שמחלקת ההורה, ה – ‪ base class‬היא איזשהו רעיון מופשט, ועל כן נקראת גם ‪ ,Abstract Date Type – ADT‬כך‬
    ‫שלעולם אנו לא באמת ניצור אובייקט מסוג ‪ ,Robot‬אלא תמיד רובוט מסוג מסוים, שהרי גם בחיים האמיתיים אנו לא‬
   ‫מתייחסים לבנאדם כאל צורת חיים אלא יורדים בדרגות ההיררכיה עד לרמת השם של האדם, אך אם נחשוב על הנושא‬
‫בצורה מבנית, נוכל לראות שאותו "יוסי" לדוגמא, משתייך למחלקה "גבר". אותו הגבר הוא תת מחלקה של "בן אדם" ואותו‬
                                                                      ‫בן אדם הוא תת מחלקה של "צורת חיים".‬

  ‫למחלקת "צורת חיים" יש גם תת מחלקה בשם "בעל חיים" ולה תת מחלקה בשם "יונק" שלה תת מחלקה בשם "כלב" ולה‬
                                                                                  ‫תת מחלקה בשם "לברדור".‬

                                                      ‫באופן דומה, אנו נרצה לייצר היררכית הורשה ברמת הקוד.‬

    ‫בחזרה לדוגמא שלנו, על מנת ליצור רובוט מסוג 2‪ R2D‬בערימה (‪ ,)Free Store‬אנו נבצע יצירת אובייקט כמו מקודם:‬

‫;)(2‪R2D2 * r2d2#1 = new R2D‬‬

                              ‫מה שהרווחנו כאן היא היכולת לרשום את השורה ;)"1#2‪r2d2#1  SetName ("R2D‬‬

  ‫למרות שבהגדרת המחלקה 2‪ R2D‬עצמה, כלל לא מופיעה הפונקציה ‪ SetName‬וכנ"ל לגבי התכונה ‪ .Name‬אלו תכונות‬
                                                                           ‫שיש לילד מעצם ההורשה מההורה.‬

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‬אנו נבצע יצירת אובייקט כמו מקודם:‬ ‫;)(2‪R2D2 * r2d2#1 = new R2D‬‬ ‫מה שהרווחנו כאן היא היכולת לרשום את השורה ;)"1#2‪r2d2#1  SetName ("R2D‬‬ ‫למרות שבהגדרת המחלקה 2‪ R2D‬עצמה, כלל לא מופיעה הפונקציה ‪ SetName‬וכנ"ל לגבי התכונה ‪ .Name‬אלו תכונות‬ ‫שיש לילד מעצם ההורשה מההורה.‬