Menu
Coddy logo textTech

ירושה יחידה ורב־רמתית

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 25 מתוך 87.

עד כה ראינו מחלקות שיורשות ישירות ממחלקת אב אחת. אבל ירושה יכולה ליצור מבנים שונים, בהתאם לקשרים בין המחלקות. בואו נבחן את שתי התבניות העיקריות: ירושה יחידה וירושה רב־רמתית.

ירושה יחידה היא מה שהשתמשנו בו עד כה. מחלקה יורשת ישירות ממחלקת אב אחת בלבד:

public class Animal { }
public class Dog extends Animal { }
public class Cat extends Animal { }

כאן, גם Dog וגם Cat יורשים מ־Animal, אבל הם לא יורשים זה מזה. לכל מחלקת־בת יש מחלקת־אב ישירה אחת.

ירושה רב־רמתית יוצרת שרשרת שבה מחלקה יורשת ממחלקה אחרת, שבעצמה יורשת ממחלקה נוספת:

public class Animal {
    public void eat() {
        System.out.println("Eating");
    }
}

public class Mammal extends Animal {
    public void breathe() {
        System.out.println("Breathing");
    }
}

public class Dog extends Mammal {
    public void bark() {
        System.out.println("Barking");
    }
}

בשרשרת הזו, Dog יורש מ־Mammal, שיורש מ־Animal. לאובייקט Dog יש גישה לכל המתודות מכל השרשרת:

Dog dog = new Dog();
dog.eat();      // מהמחלקה Animal
dog.breathe();  // מהמחלקה Mammal
dog.bark();     // מהמחלקה Dog

זכור ש-Object נמצא בראש כל שרשרת. לכן ל-Dog שלנו יש למעשה ארבע רמות: Object -> Animal -> Mammal -> Dog. שרשור בנאים עובר דרך כל הרמות האלה בעת יצירת אובייקט חדש.

challenge icon

אתגר

קל

בואו נבנה היררכיית כלי תחבורה המדגימה דפוסי ירושה חד־רמתית ורב־רמתית. תיצרו שרשרת של מחלקות שבה כל רמה מוסיפה יכולות חדשות, ותראו כיצד מתודות עוברות בירושה דרך כמה רמות.

תארגנו את הקוד שלכם בארבעה קבצים:

  • Vehicle.java: צרו את מחלקת הבסיס בראש ההיררכיה. לכל כלי רכב צריכים להיות:
    • שדה פרטי עבור brand (String)
    • בנאי שמקבל את המותג
    • מתודה getBrand() שמחזירה את המותג
    • מתודה move() שמדפיסה: [brand] is moving
  • LandVehicle.java: צרו מחלקה שיורשת מ-Vehicle ומייצגת את הרמה האמצעית בשרשרת הרב־רמתית שלכם. כלי רכב יבשתיים מוסיפים התנהגות ייחודית לנסיעה על הקרקע:
    • שדה פרטי עבור wheels (int)
    • בנאי שמקבל מותג ומספר גלגלים, ומשתמש ב-super(brand) עבור החלק של מחלקת האב
    • מתודה getWheels() שמחזירה את מספר הגלגלים
    • מתודה honk() שמדפיסה: [brand] honks!
  • Car.java: צרו מחלקה שיורשת מ-LandVehicle ומשלימה את שרשרת הירושה בת שלוש הרמות שלכם. מכוניות מוסיפות תכונות ייחודיות משלהן:
    • שדה פרטי עבור model (String)
    • בנאי שמקבל מותג, מספר גלגלים ודגם, ומשתמש ב-super(brand, wheels)
    • מתודה getModel() שמחזירה את הדגם
    • מתודה displayInfo() שמדפיסה: [brand] [model] with [wheels] wheels
  • Main.java: הדגימו כיצד לאובייקט Car יש גישה למתודות מכל שלוש הרמות בהיררכיה. תקבלו שלוש קלטים: מותג (String), מספר גלגלים (int) ודגם (String). צרו Car וקראו למתודות האלה לפי הסדר:
    • move() - עוברת בירושה מ-Vehicle (סבתא)
    • honk() - עוברת בירושה מ-LandVehicle (הורה)
    • displayInfo() - מוגדרת במחלקת Car עצמה

תקבלו שלושה קלטים: שם המותג, מספר הגלגלים ושם הדגם.

הפלט שלכם צריך להציג שלוש שורות המדגימות כיצד אובייקט Car יכול להשתמש במתודות מכל רמה בשרשרת הירושה שלו — החל מ-Vehicle שברמה העליונה ועד למחלקה שלו עצמו!

נסו בעצמכם

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // קרא את הקלטים
        String brand = scanner.nextLine();
        int wheels = scanner.nextInt();
        scanner.nextLine(); // צרוך את תו השורה החדשה
        String model = scanner.nextLine();
        
        // TODO: צור אובייקט Car עם ערכי הקלט
        
        // TODO: קרא ל־move() - עברה בירושה מ־Vehicle (מחלקת הסב)
        
        // TODO: קרא ל־honk() - עברה בירושה מ־LandVehicle (מחלקת האב)
        
        // TODO: קרא ל־displayInfo() - מוגדרת ב־Car עצמה
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Java אונליין