JavaRush /בלוג Java /Random-HE /יחסים בין כיתות. ירושה, הרכב וצבירה

יחסים בין כיתות. ירושה, הרכב וצבירה

פורסם בקבוצה
שלום! היום נסתכל מקרוב על עיקרון נוסף של תכנות מונחה עצמים (OOP) - ירושה. במקביל, נלמד סוגים נוספים של קשרים בין כיתות – הרכב וצבירה. נושא זה לא יהיה קשה: כבר נתקלת בירושה ובדוגמאות שלה פעמים רבות בהרצאות קודמות. היום העיקר יהיה לגבש את הידע שלך, להסתכל מקרוב על מנגנון הירושה ושוב לעבור על הדוגמאות :) אז, בואו נלך!
יחסים בין כיתות.  ירושה, הרכב וצבירה - 1

תורשה בג'אווה והיתרונות שלה

כפי שאתם ודאי זוכרים, ירושה היא מנגנון המאפשר לתאר מחלקה חדשה על סמך מחלקה קיימת (הורה). במקרה זה, המאפיינים והפונקציונליות של מחלקת האב מושאלים על ידי המחלקה החדשה. בואו נזכור את הדוגמה של ירושה מהרצאות קודמות:
public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }


public void gas() {
       //...gas
   }

public void brake() {
       //...brake
   }
}


public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}



public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
ישנה תוכנית מסוימת שבתוכה אנחנו עובדים עם סוגים שונים של מכוניות. גם אם אתה לא חובב רכב, אתה בטח יודע שיש הרבה מאוד סוגים של אותן מכוניות בעולם :) לכן, אנו מפרידים את המאפיינים הכלליים של מכוניות למחלקת אב משותפת - Car. מה משותף לכל המכוניות, ללא קשר לסוג? לכל מכונית יש שנת ייצור, שם דגם ומהירות מרבית. אנחנו מכניסים את המאפיינים האלה לשדות model, maxSpeed, yearOfManufacture. לגבי התנהגות, כל מכונית יכולה להאיץ ולבלום :) אנו מגדירים התנהגות זו בשיטות gas()ו brake(). אילו יתרונות זה נותן לנו? קודם כל, צמצום כמות הקוד. כמובן, אנחנו יכולים להסתדר בלי כיתת ההורים. אבל מכיוון שכל מכונית חייבת להיות מסוגלת להאיץ ולבלום, נצטרך ליצור שיטות gas()במחלקה , במחלקה brake(), במחלקה , במחלקה ובכל מחלקות המכוניות האחרות. תארו לעצמכם כמה קוד נוסף נכתוב במקרה זה. אל תשכח את שדות הדגם, maxSpeed ​​​​ו-yearOfManufacture: אם נוטש את כיתת האב, ניצור אותם בכל אחת ממחלקות המכונות! כשיהיו לנו כמה תריסר כיתות מכונה, כמות הקוד החוזר תהפוך לרצינית באמת. העברת שדות ושיטות נפוצות (הנקראות גם "מצב" ו"התנהגות") לכיתה האב תאפשר לנו לחסוך הרבה זמן ומקום. אם לסוג מסוים יש תכונות או שיטות ייחודיות רק לו ונעדרות מסוגים אחרים של מכונות, זה לא משנה. תמיד אפשר ליצור אותם בכיתת צאצאים, בנפרד מכל האחרים. TruckSedanF1CarSportcarיחסים בין כיתות.  ירושה, הרכב וצבירה - 2
public class F1Car extends Car {

   public void pitStop() {

       //...only racing cars make pit stops
   }

   public static void main(String[] args) {

       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
קח את המקרה של מכוניות מירוץ פורמולה 1. להם, בניגוד ל"קרובי המשפחה" שלהם, יש התנהגות ייחודית - מעת לעת הם עוצרים לעצירת פיט. זה לא מפריע לנו. כבר תיארנו את ההתנהגות הכללית בכיתה האב Car, ונוכל להוסיף התנהגות ספציפית של הכיתות הצאצאים בתוך הכיתות. יחסים בין כיתות.  ירושה, הרכב וצבירה - 3 זה תקף גם לשדות: אם לכיתה ילד יש מאפיינים ייחודיים, נוכל להכריז בתוכה ברוגע על השדות האלה ולא לדאוג :) היכולת לעשות שימוש חוזר בקוד היא היתרון העיקרי של הורשה. למתכנת חשוב מאוד לא לכתוב כמויות קוד מיותרות. אתה תיתקל בזה יותר מפעם אחת בעבודה שלך. אנא זכרו עוד דבר חשוב מאוד: אין ירושה מרובה ב-Java. כל מחלקה יורשת ממחלקה אחת בלבד. נדבר על הסיבות לכך ביתר פירוט בהרצאות הבאות, אבל לעת עתה רק זכרו. זה, אגב, מבדיל את Java מכמה שפות OOP אחרות. לדוגמה, ל-C++ יש ירושה מרובה. הכל פחות או יותר ברור עם ירושה - בואו נמשיך הלאה.

הרכב ואגרגציה

כיתות ואובייקטים יכולים להיות קשורים זה לזה. ירושה מתארת ​​את הקשר "הוא" (או באנגלית "IS A"). ליאו הוא חיה. קשר זה יכול לבוא לידי ביטוי בקלות באמצעות ירושה, כאשר Animalהכיתה תהיה ההורה והכיתה Lionתהיה הילד. עם זאת, לא כל מערכות היחסים בעולם מתוארות בצורה זו. לדוגמה, מקלדת בהחלט מחוברת למחשב בדרך כלשהי, אבל היא לא מחשב . הידיים קשורות איכשהו לאדם, אבל הן לא האדם. במקרים אלה, הוא מבוסס על סוג אחר של יחס: לא "הוא", אלא "הוא חלק" ("HAS A"). היד היא לא אדם, אלא היא חלק מאדם. המקלדת היא לא מחשב, אבל היא חלק מהמחשב. ניתן לתאר קשרי HAS A בקוד באמצעות מנגנוני קומפוזיציה וצבירה . ההבדל ביניהם טמון ב"הקפדה" של קשרים אלו. בוא ניתן דוגמה פשוטה: יש לנו את שלנו - מכונית. לכל מכונית יש מנוע. בנוסף, בכל מכונית יש נוסעים בפנים. מה ההבדל המהותי בין שדות ו ? אם במכונית יש נוסע בפנים , זה לא אומר שלא יכולים להיות בה נוסעים . מכונית אחת יכולה להכיל מספר נוסעים. בנוסף, אם כל הנוסעים יורחקו מהמכונית, היא תמשיך לפעול בשקט. היחס בין המחלקה למסת הנוסעים פחות נוקשה. זה נקרא צבירה . יש מאמר טוב בנושא זה: יחסים בין כיתות (חפצים) . זה מספק עוד דוגמה טובה לצבירה. נניח שיש לנו כיתה שמציינת תלמיד, וכיתה (קבוצת תלמידים). סטודנט יכול להיות חבר במועדון פיסיקה, מועדון מעריצים של סטודנטים במלחמת הכוכבים או קבוצת KVN. קומפוזיציה היא סוג קפדני יותר של תקשורת. בעת שימוש בקומפוזיציה, אובייקט אינו רק חלק מאובייקט כלשהו, ​​אלא גם אינו יכול להשתייך לאובייקט אחר מאותו סוג. הדוגמה הפשוטה ביותר היא מנוע של מכונית. מנוע הוא חלק ממכונית, אך אינו יכול להיות חלק ממכונית אחרת. כפי שאתה יכול לראות, הקשר שלהם הרבה יותר מחמיר מזה של ו . CarEngine enginePassenger [] passengersАBCCarPassenger [] passengersStudentStudentsGroupCarPassengersיחסים בין כיתות.  ירושה, הרכב וצבירה - 4
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION