CodeGym /בלוג Java /Random-HE /יחסים בין כיתות. ירושה, הרכב וצבירה
John Squirrels
רָמָה
San Francisco

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

פורסם בקבוצה
היי! היום נסתכל מקרוב על עיקרון אחד של תכנות מונחה עצמים (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()במחלקות Truck, Sedan, F1Car, ומחלקות SportsCarובכל מחלקת מכוניות אחרת. תארו לעצמכם כמה קוד נוסף נצטרך לכתוב. ואל תשכחו את השדות model, maxSpeed, ו yearOfManufacture: אם ניפטר מכיתת ההורים, נצטרך ליצור אותם בכל כיתת רכב! יחסים בין כיתות.  ירושה, הרכב וצבירה - 2כשיש לנו כמה תריסר כיתות רכב, כמות הקוד הכפול הופכת להיות רצינית מאוד. העברת שדות ושיטות נפוצות (הנקראות גם "מצבים" ו"התנהגות") לכיתה אב מאפשרת לנו לחסוך הרבה זמן ומקום. אם לסוג מסוים יש מאפיינים או שיטות ייחודיות שאין לסוגי רכב אחרים, לא נורא. אתה תמיד יכול ליצור אותם בכיתת צאצאים, בנפרד מכולם.

public class F1Car extends Car {

   public void pitStop() {

       // Only race 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++ תומך בירושה מרובה. הכל פחות או יותר ברור עם ירושה. בוא נמשיך הלאה.

קומפוזיציה וצבירה

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