Menu
Coddy logo textTech

שרשור בנאים

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

שרשור בנאים הוא תהליך של קריאה לבנאי אחד מתוך בנאי אחר. הטכניקה הזו עוזרת להימנע משכפול קוד כאשר למחלקה יש כמה בנאים או כשעובדים עם היררכיות של ירושה.

בתוך אותה מחלקה, אפשר לשרשר בנאים באמצעות this(). כך אפשר להגדיר בנאי "ראשי" אחד שמבצע את כל העבודה, בעוד שבנאים אחרים פשוט מעבירים אליו את האחריות:

public class Rectangle {
    private int width;
    private int height;
    
    public Rectangle() {
        this(1, 1);  // קורא לבנאי שמקבל שני פרמטרים
    }
    
    public Rectangle(int size) {
        this(size, size);  // יוצר ריבוע
    }
    
    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }
}

בירושה, שרשור בנאים מתרחש באופן אוטומטי. כשיוצרים אובייקט של מחלקת משנה, Java קוראת תחילה לבנאי של מחלקת האב באמצעות super(). אם לא קוראים במפורש ל־super(), Java מוסיפה אוטומטית את super() (הגרסה ללא ארגומנטים):

public class Animal {
    private String name;
    
    public Animal(String name) {
        this.name = name;
        System.out.println("Animal constructor");
    }
}

public class Dog extends Animal {
    private String breed;
    
    public Dog(String name, String breed) {
        super(name);  // חייבת להיות השורה הראשונה
        this.breed = breed;
        System.out.println("Dog constructor");
    }
}

יצירת new Dog("Buddy", "Labrador") מדפיסה תחילה "Animal constructor", ואז "Dog constructor". כך מובטח שמחלקות האב מאותחלות תמיד כראוי לפני שמחלקת הבת מוסיפה את ההגדרות שלה.

challenge icon

אתגר

קל

בואו נבנה מערכת להזמנת מוצרים שמדגימה שרשור בנאים, הן בתוך מחלקה והן לאורך היררכיית ירושה. תראו כיצד this() משרשר בנאים באותה מחלקה, ואילו super() משרשר לבנאים של מחלקת האב.

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

  • Product.java: צרו מחלקת אב שמייצגת כל מוצר בחנות. היא צריכה לכלול:
    • שדות פרטיים עבור name (String) ועבור price (double)
    • בנאי ראשי שמקבל גם שם וגם מחיר, מאתחל את השדות ומדפיס: Product constructor: [name]
    • בנאי שני שמקבל רק את השם ומשרשר לבנאי הראשי באמצעות this(name, 0.0) כדי להגדיר מחיר ברירת מחדל של 0.0
    • מתודות getName() ו-getPrice() לגישה לשדות
  • Electronics.java: צרו מחלקת משנה שיורשת מ-Product ומוסיפה מידע על האחריות:
    • שדה פרטי עבור warrantyYears (int)
    • בנאי ראשי שמקבל שם, מחיר ו-warrantyYears - השתמשו ב-super(name, price) כדי לאתחל את מחלקת האב, לאחר מכן הגדירו את תקופת האחריות והדפיסו: Electronics constructor: [warrantyYears] year warranty
    • בנאי שני שמקבל רק שם ומחיר, ומשרשר לבנאי הראשי באמצעות this(name, price, 1) כדי להגדיר אחריות ברירת מחדל של שנה אחת
    • בנאי שלישי שמקבל רק את השם ומשרשר לבנאי השני באמצעות this(name, 0.0)
    • מתודה getDetails() שמחזירה: [name] - $[price] ([warrantyYears] year warranty)
  • Main.java: הדגימו את שרשור הבנאים בפעולה. תקבלו שלושה קלטים: שם מוצר (String), מחיר (double) ושנות אחריות (int). צרו אובייקט Electronics באמצעות שלושת הפרמטרים, ואז הדפיסו את התוצאה של getDetails().

תקבלו שלושה קלטים: שם המוצר, המחיר ושנות האחריות.

עצבו את המחיר ב-getDetails() כך שיוצגו 2 ספרות אחרי הנקודה העשרונית, באמצעות String.format("%.2f", price). שימו לב היטב לפלט - תראו את הודעות הבנאים מופיעות לפי הסדר, וכך תוכלו לראות כיצד השרשור מתקדם ממחלקת האב למחלקת הבת!

נסו בעצמכם

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // קרא את הקלטים
        String name = scanner.nextLine();
        double price = scanner.nextDouble();
        int warrantyYears = scanner.nextInt();
        
        // TODO: צור אובייקט Electronics באמצעות כל שלושת הפרמטרים
        
        // TODO: הדפס את התוצאה של getDetails()
    }
}
quiz iconבחנו את עצמכם

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

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

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