מהי ירושה מרובים ב- Java?
OOP וירושה
השימוש בתכנות מונחה עצמים משתמש במושג הירושה כדי להרחיב את הפונקציונליות של אובייקטים. חשוב על כאשר מתכנת יוצר אובייקט. מאוחר יותר אתה יכול לראות שאתה צריך ליצור אובייקט דומה מאוד עם רק הבדלים קלים (אולי להרחיב את הפונקציונליות של אובייקט קודם בהקשר חדש). כאן מופיעה הירושה. אובייקט שמתכנת "נגזר" מאובייקט "Base" אחר יורש את השיטות והמשתנים של הכיתה, ולאחר מכן יכול להוסיף פונקציונליות נוספת (כמו בדוגמה הבאה של Java):
הציבור בכיתה Sphere {הציבור int רדיוס; }
מעמד ציבורי בול מרחיב ספירה {צבע מחרוזת ציבורית; // Ball מוסיף את המשתנה "color", אך גם משתמש במשתנה "רדיוס"}
מורשת מרובה
בשלב מסוים, מתכנת עשוי להתפתות לגזור בכיתה אחת של כמה שיעורים. זה ידוע בשם "ירושה מרובים" ולמרות שזה נראה שימושי, זה יכול לגרום לבעיות, כגון "בעיית היהלומים" החשובה. בעיה זו מתרחשת כאשר שתי כיתות יורשות מאותה המחלקה (כמעמד B ו- C נובעות ממחלקה A), בעוד שקבוצה אחרת (D) נובעת מ- B ו- C. כאשר נוצר אובייקט D, המערכת מתייחסת אליו כאל סוג של מעמד הבסיס (בכיתה "כדור" או כדור "כדור" או כדור, למשל). בבעיית היהלום, המערכת לא יכולה לקבוע באופן מכריע איזה סוג D (האם זה סוג עבד או סוג ACD?) האם זה גורם לבעיות.
Java ו ירושה מרובים
בשל בעיות בירושה מרובות, Java אינה מאפשרת זאת. אבל במציאות מעמדות הנגזרים מכמה מעמדות בסיס ניתן להשיג בצורה מאובטחת באמצעות "ממשקים". ממשק דומה למחלקה, אך לא רק מגדיר את מבנה הכיתה, אלא גם את הקוד האמיתי שלה. מחלקה בסיסית המיישמת ממשק אינה בהכרח "לרשת" את הפונקציונליות של הממשק: היא רק מבטיחה את השימוש במבנה שלה. כיוון שכיתה שמממשת ממשק אינה יורשת ממחלקה אחרת (ואינה סוג של מחלקה בסיסית), מתכנת יכול ליישם מספר ממשקים באמצעות אותה המחלקה.
דוגמה: ירושה וממשקים
הדוגמה הבאה מציגה את ההבדל בין הירושה של אובייקטים לבין ממשק. כיתה שירשה מאדם אחר מקבלת גישה למחלקת הבסיס משום שהיא בעצם הופכת לסוג של מחלקה זו (כמו בשיעורי "בול" ו"ספירה "). מחלקה המיישמת ממשק רק מבטיחה ליישם את מבנה הממשק שלה: היא אינה סוג של ממשק זה:
interface Basic {int doubleA (); // הערה: לא מוגדר קוד אמיתי בממשק}
המעמד הציבורי B מיישם בסיסי {
int הציבור;
(2) a ("a").