שיעורי מודול (1/2)
ירושה
ירושה הוא מנגנון בסיסי של OOP המאפשר למחלקה (הנקראת מחלקת ילד או תת-מחלקה) לרשת שדות ושיטות ממחלקה אחרת (נקראת מחלקה אב או מחלקה על).
זה מקדם שימוש חוזר בקוד ומונע חזרה מיותרת.
הרחבת כיתה עם extends
ב-Java, אנו משתמשים במילת המפתח extends כדי לציין שמחלקה יורשת מאחרת:
class Vehicle {
protected int speed; // 'protected' makes the field visible to subclasses
public void honk() {
System.out.println("Beep beep!");
}
}
class Car extends Vehicle {
// Car automatically inherits the speed field and the honk() method
}הבנאי ומילת המפתח super()
אם למחלקת העל יש בנאי שמקבל פרמטרים, תת המחלקה חייבת לקרוא לו במפורש בבנאי שלה באמצעות super(...) בתור המשפט הראשון מאוד:
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
class Student extends Person {
int studentId;
public Student(String name, int studentId) {
super(name); // Invokes the constructor of Person
this.studentId = studentId;
}
}עקיפת שיטה (@Override)
תת-מחלקה יכולה לספק יישום ספציפי משלה לשיטה שעברה בירושה ממחלקת העל. פעולה זו נקראת עקיפה (עקיפה של שיטה) והיא מסומנת על ידי ההערה @Override.
class Animal {
public void makeSound() {
System.out.println("Rumore generico");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Miao!");
}
}השינוי protected
משנה הגישה protected ממלא תפקיד מפתח בירושה. בניגוד ל-private, מה שהופך את החברים לגלויים רק בתוך אותה מחלקה, protected מאפשר גישה לשדות ושיטות הן בתוך אותה חבילה והן על ידי כל תת המחלקות, גם אם הם נמצאים בחבילות שונות.
גישה לחברי הורים עם super
בנוסף לקריאה לבנאי מחלקות העל, ניתן להשתמש במילת המפתח super בתוך שיטות תת מחלקות כדי להתייחס לשיטות או למשתנים של מחלקת האב. זה שימושי במיוחד כאשר שיטה נדחפת, אבל אתה עדיין רוצה להפעיל את התנהגות ההורה המקורית:
class Animal {
public void sleep() {
System.out.println("Zzz");
}
}
class Cat extends Animal {
@Override
public void sleep() {
super.sleep(); // Executes the behavior of Animal
System.out.println("The cat purrs while sleeping.");
}
}ירושה יחידה בג'אווה
ב-Java, מחלקה יכולה להרחיב מחלקה אחת בלבד (ירושה בודדת). ירושה ישירה ממספר מחלקות (ירושה מרובה) אינה מותרת; לדוגמה, class Cat extends Animal, Mammal יגרום לשגיאת קומפילציה. בחירת עיצוב זו מונעת אי בהירות המכונה "בעיית היהלומים" (כאשר שתי מחלקות-על מגדירות את אותה שיטה עם יישומים שונים). כדי להתגבר על מגבלה זו, Java מציגה את המושג ממשקים, אותו נחקור במודול הבא.
נסה זאת בעצמך
השלם את תת המחלקה Dog על ידי הרחבת Animal. הכריז על בנאי הכלב שמקבל שם (מחרוזת) ומשתמש בסופר(שם) כדי להעביר אותו לבנאי החיות.
הצג רמז
כתוב `כלב ציבורי(שם מחרוזת) { super(שם); }` בתוך כיתת הכלב.
הפתרון זמין לאחר 3 ניסיונות
הרחב את Dog מ- Animal ועקוף את שיטת makeSound() כך שתחזיר את המיתר Woof במקום Generic Sound. השתמש בהערה @Override.
הצג רמז
כתוב `@Override` מעל ההצהרה `public String makeSound() { return 'Woof'; }` בתוך כלב.
הפתרון זמין לאחר 3 ניסיונות
הכריז על מחלקה Cat שמרחיבה את Animal ומעקפת את שיטת makeSound() כדי להחזיר את המחרוזת Meow. לכיתה Animal כבר יש בנאי שמקבל שם; ודא שגם בנאי ה-Cat מקבל שם ומעביר אותו בצורה נכונה לבנאי מחלקת העל.
הצג רמז
צור את הכיתה 'חתול' המשתרעת על 'חיה'. הכריז על הקונסטרוקטור `public Cat(String name) { super(name); }` ועקוף את שיטת `makeSound()` באמצעות `@Override` כדי להחזיר `'Meow'`.
הפתרון זמין לאחר 3 ניסיונות