ירושה בסיסית (extends)
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 20 מתוך 87.
ירושה היא אחד מעמודי התווך המרכזיים של OOP. היא מאפשרת למחלקה לרכוש את המאפיינים והמתודות של מחלקה אחרת, מעודדת שימוש חוזר בקוד ומבססת היררכיה טבעית בין מחלקות.
ב-Java, יוצרים קשר ירושה באמצעות מילת המפתח extends. המחלקה שיורשת נקראת מחלקת משנה (או מחלקת בת), והמחלקה שממנה יורשים נקראת מחלקת על (או מחלקת אב).
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " is eating");
}
public String getName() {
return name;
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name); // קורא לבנאי של מחלקת האב
}
public void bark() {
System.out.println(getName() + " says woof!");
}
}המחלקה Dog יורשת באופן אוטומטי את המתודה eat() ואת המתודה getName() מהמחלקה Animal. היא יכולה גם להגדיר מתודות משלה, כמו bark():
Dog myDog = new Dog("Buddy");
myDog.eat(); // עבר בירושה: "Buddy is eating"
myDog.bark(); // מתודה משלו: "Buddy says woof!"חשבו על ירושה כעל קשר מסוג „הוא סוג של”. כלב הוא בעל חיים, ולכן הגיוני ש־Dog ירחיב את Animal. הקשר הזה מאפשר לכם ליצור מחלקות ייעודיות שמשתפות פונקציונליות משותפת ומוסיפות התנהגויות ייחודיות משלהן.
אתגר
קלבואו נבנה מערכת פשוטה של כלי רכב שמדגימה ירושה בפעולה. תיצרו מחלקת־אב שמכילה מאפיינים משותפים לכלי רכב, ומחלקת־בת שמרחיבה אותה בהתנהגות ייחודית.
תארגנו את הקוד בשלושה קבצים:
Vehicle.java: צרו מחלקת־אב שמייצגת כל כלי רכב. צריכים להיות בה:- שדה פרטי עבור ה
brandשל כלי הרכב (String) - בנאי שמקבל את שם המותג ומשייך אותו לשדה. (אין צורך בקריאה ל־
super()כאן, מכיוון ש־Vehicle נמצאת בראש ההיררכיה.) - מתודה
getBrand()שמחזירה את המותג - מתודה
start()שמדפיסה:[brand] is starting
- שדה פרטי עבור ה
Motorcycle.java: צרו מחלקת־בת שמרחיבה את Vehicle. אופנוע הוא כלי רכב, ולכן קשר מסוג "is-a" זה הופך את הירושה למתאימה. מחלקת Motorcycle שלכם צריכה:- להשתמש ב־
extendsכדי לרשת מ־Vehicle - להכיל בנאי שמקבל את המותג ומעביר אותו למחלקת־האב באמצעות
super(brand) - להוסיף מתודה משלה
wheelie()שמדפיסה:[brand] is doing a wheelie!
- להשתמש ב־
Main.java: חברו הכול יחד על ידי יצירת אובייקט Motorcycle והדגמת ההתנהגויות שהיא יורשת וההתנהגויות הייחודיות לה. תקבלו קלט אחד: שם המותג. הדפיסו שתי שורות באמצעות קריאה ל:- מתודת
start()שירשה - מתודת
wheelie()של Motorcycle
- מתודת
תקבלו קלט אחד: שם המותג (String) של האופנוע שלכם.
שימו לב איך ל־Motorcycle יש גישה אוטומטית ל־start() ול־getBrand() בלי לכתוב אותם מחדש — זה הכוח של הירושה!
נסו בעצמכם
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String brand = scanner.nextLine();
// TODO: ליצור אובייקט Motorcycle עם המותג
// TODO: לקרוא למתודה start() שהתקבלה בירושה
// TODO: לקרוא למתודה wheelie()
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא לתכנות מונחה עצמיםמחלקות לעומת אובייקטיםמילת המפתח thisמתודותשדות (מאפיינים)מתודת הבנאיהעמסת בנאיםחזרה – מחשבון פשוט4ירושה
ירושה בסיסית (extends)מילת המפתח superדריסת מתודות (@Override)שרשור בנאיםהמחלקה Objectירושה יחידה ורב־רמתיתלמה אין ירושה מרובה של מחלקותסיכום – היררכיית עובדים7מתודות מיוחדות ומחלקת Object
מתודת toString()equals() ו-hashCode()מתודת clone()compareTo() ו-Comparableהממשק Comparatorסיכום – מיון מותאם אישית2מצייני גישה ואנקפסולציה
סקירה של רמות הגישהמתודות Getter ו-Setterהסתרת מידעמילת המפתח finalסיכום – מנהל חשבון בנק5פולימורפיזם
יסודות העמסת מתודותדריסת מתודות (בזמן ריצה)המרה כלפי מעלה וכלפי מטההאופרטור instanceofמחלקות ומתודות מופשטותסיכום – מחשבון צורות8מושגי OOP מתקדמים
הרכבה מול ירושהאגרגציה מול הרכבהמחלקות פנימיות, מקוננות ואנונימיותEnums ומתודות של EnumRecords (Java 16+)מחלקות חתומות (Java 17+)3מאפייני מחלקה וחברים סטטיים
משתני מופע לעומת משתנים סטטייםמתודות סטטיותבלוקים סטטייםקבועים (static final)סיכום — מונה ומחלקת עזר6ממשקים ומחלקות מופשטות
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםמתודות ברירת מחדל וסטטיות בממשקמחלקות מופשטות לעומת ממשקיםממשקים פונקציונלייםסיכום – מערכת תשלומיםתרגלו בעצמכם: קומפיילר Java אונליין