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

תורשה בג'אווה ויתרונותיה
כפי שאתה בוודאי זוכר, ירושה היא מנגנון המאפשר לך לתאר מחלקה חדשה על סמך מחלקה קיימת (מחלקה אב). בכך, המחלקה החדשה שואלת את המאפיינים והפונקציונליות של מחלקת האב. נזכיר דוגמה של ירושה שניתנה בשיעורים קודמים:
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
: אם ניפטר מכיתת ההורים, נצטרך ליצור אותם בכל כיתת רכב! 
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
האב, וניתן להוסיף את ההתנהגות הספציפית של כיתות צאצאות לאותן מחלקות. 
קומפוזיציה וצבירה
ניתן לקשר בין מחלקות ואובייקטים. ירושה מתארת מערכת יחסים "הוא-א". אריה הוא חיה. מערכת יחסים כזו מתבטאת בקלות באמצעות ירושה, היכןAnimal
שכבת ההורים ומהו Lion
הילד. עם זאת, לא כל מערכות היחסים מתוארות כך. לדוגמה, מקלדת בהחלט קשורה למחשב, אבל היא לא מחשב . ידיים קשורות איכשהו לאדם, אבל הן לא אדם. במקרים אלו, יש לנו סוג אחר של מערכת יחסים: לא "יש-א", אלא "יש-א". יד היא לא אדם, אלא היא חלק מאדם. מקלדת היא לא מחשב, אלא היא חלק ממחשב. ניתן לתאר קשר יש - א בקוד באמצעות קומפוזיציה וצבירה . ההבדל טמון ב"הקפדה" של הקשר. בוא ניתן דוגמה פשוטה: יש לנו שיעור . לכל מכונית יש מנוע. בנוסף, בכל מכונית יש נוסעים. מה ההבדל המהותי בין השדות ל ? זה שהנוסע יושב במכונית לא אומר שנוסעים ואינם נמצאים במכונית. מכונית יכולה להתאים למספר נוסעים. מה גם שאם כל הנוסעים יצאו ממכונית, הוא עדיין יתפקד בצורה חלקה. היחס בין המחלקה למערך פחות קפדני. זה נקרא צבירה . זה מספק עוד דוגמה טובה לצבירה. נניח שיש לנו כיתה וכיתה . סטודנט יכול להצטרף למספר ארגוני סטודנטים: מועדון פיזיקה, מועדון מעריצים של מלחמת הכוכבים ו/או מועדון סטודנטים. קומפוזיציה היא סוג קפדני יותר של מערכת יחסים. בעת שימוש בקומפוזיציה, אובייקט הוא חלק מאובייקט כלשהו ואינו יכול להשתייך לאובייקט אחר מאותו סוג. הדוגמה הפשוטה ביותר היא מנוע של מכונית. מנוע הוא חלק ממכונית ואינו יכול להיות חלק ממכונית אחרת. כפי שאתה יכול לראות, היחסים ביניהם נוקשים בהרבה מהיחסים בין לבין . Car
Engine engine
Passenger[] passengers
A
B
C
Car
Passenger[] passengers
Student
StudentGroup
Car
Passengers

GO TO FULL VERSION