מה ההבדל בין שיעורים קונקרטיים לשיעורים מופשטים?


תשובה 1:

ההבדל האמיתי היחיד הוא שניתן לייצר מעמד קונקרטי מכיוון שהוא מספק (או יורש) את היישום לכל שיטותיו. לא ניתן לייצר כיתה מופשטת מכיוון שלפחות שיטה אחת לא יושמה.

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

  1. ירושה מיישמת - מספקת מנגנון לשימוש חוזר בקוד. ירושה במשטח - מספקת מנגנון להקלדת משנה.

אם Class B מרחיב את Class A, זה לא בהכרח אומר ש- B הוא A. זה יכול רק אומר ש- B יורש קוד כלשהו מ- A. זה לא תמיד ברור, וכמה שפות מבלבלות את זה עם הקלדת משנה.

Java היא דוגמה לשפה המספקת מבנה שונה להקלדת משנה, המכונה ממשק. הממשקים הם בעצם שיעורים מופשטים טהורים. אם Class B מיישם ממשק A, B הוא A.

כאשר שפה מנתקת את ההטמעה של ירושה מירושת הממשק, ניתן להתייחס לבעיות מסוימות בצורה שונה. לדוגמה:

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

תשובה 2:

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


תשובה 3:

בואו נניח שיש ממשק שיושם על ידי כל אחד מהכיתות.

מחלקת הבטון מיישמת את כל שיטות הממשקים, וכך ניתן לייצר אותה מבלי להתעדכן.

אם מסיבה כלשהי אתה רוצה להשאיר את היישום של שיטות מסוימות בחוץ (למשל, ברצונך לכתוב שני יישומים של הממשק אשר נבדלים זה מזה מעט), אתה כותב כיתה מופשטת, שלא ניתן ליישם אותה ישירות. כדי לייצר כיתה מופשטת, אתה כותב תת-משנה קונקרטית ("משתרע") בה אתה מיישם את שאר השיטות, או סיפק את היישום של האחרון כשאתה מייצר (שזה טכנית זהה: "כתבת תת-קונקרטית", אבל זה אנונימי).


תשובה 4:

בואו נניח שיש ממשק שיושם על ידי כל אחד מהכיתות.

מחלקת הבטון מיישמת את כל שיטות הממשקים, וכך ניתן לייצר אותה מבלי להתעדכן.

אם מסיבה כלשהי אתה רוצה להשאיר את היישום של שיטות מסוימות בחוץ (למשל, ברצונך לכתוב שני יישומים של הממשק אשר נבדלים זה מזה מעט), אתה כותב כיתה מופשטת, שלא ניתן ליישם אותה ישירות. כדי לייצר כיתה מופשטת, אתה כותב תת-משנה קונקרטית ("משתרע") בה אתה מיישם את שאר השיטות, או סיפק את היישום של האחרון כשאתה מייצר (שזה טכנית זהה: "כתבת תת-קונקרטית", אבל זה אנונימי).