שרשור בנאים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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". כך מובטח שמחלקות האב מאותחלות תמיד כראוי לפני שמחלקת הבת מוסיפה את ההגדרות שלה.
אתגר
קלבואו נבנה מערכת להזמנת מוצרים שמדגימה שרשור בנאים, הן בתוך מחלקה והן לאורך היררכיית ירושה. תראו כיצד 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()
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין