יסודות העמסת מתודות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 28 מתוך 87.
פולימורפיזם פירושו "צורות רבות". ב-Java, הוא מאפשר לאובייקטים להתנהג בדרכים שונות בהתאם להקשר. אחת מצורות הפולימורפיזם היא העמסת מתודות, שנקראת גם פולימורפיזם בזמן הידור, משום ש-Java קובעת איזו מתודה להפעיל במהלך ההידור.
העמסת מתודות מאפשרת לך להגדיר כמה מתודות עם אותו שם אבל פרמטרים שונים. המהדר מבחין ביניהן על סמך מספר הפרמטרים, הסוג שלהם או הסדר שלהם:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
public double add(double a, double b) {
return a + b;
}
}כשקוראים ל־add(5, 3), Java משתמשת בשיטה הראשונה. קריאה ל־add(5, 3, 2) מפעילה את השנייה, ו־add(5.0, 3.0) מפעילה את השלישית. המהדר בוחר בגרסה המתאימה על סמך הארגומנטים שסיפקת.
שימו לב ששינוי של טיפוס ההחזרה בלבד אינו העמסת יתר תקפה. רשימת הפרמטרים חייבת להיות שונה:
// זו אינה העמסת מתודות תקינה - הקוד לא יתקמפל
public int getValue() { return 1; }
public double getValue() { return 1.0; } // שגיאה!כבר ראית העמסת יתר בעבר, בהעמסת יתר של בנאים. העמסת מתודות פועלת לפי אותם כללים ומספקת גמישות בכך שהיא מאפשרת למתודה אחת לטפל בתרחישי קלט שונים.
אתגר
קלבואו נבנה מעצב הודעות שמדגים העמסת מתודות באמצעות מתן כמה דרכים לעצב הודעות. תיצרו מחלקת עזר עם כמה מתודות format מועמסות, שמטפלות בתרחישי קלט שונים.
תארגנו את הקוד שלכם בשני קבצים:
MessageFormatter.java: צרו מחלקה שמספקת עיצוב הודעות גמיש באמצעות מתודות מועמסות. המעצב שלכם צריך לכלול:- מתודה
format(String message)שמחזירה את ההודעה כשהיא מוקפת בסוגריים מרובעים:[message] - מתודה
format(String message, int repeatCount)שמחזירה את ההודעה כשהיא חוזרת מספר הפעמים שצוין, עם רווחים ביניהן - מתודה
format(String message, String prefix)שמחזירה את ההודעה עם הקידומת המצורפת אליה:prefix: message - מתודה
format(String message, String prefix, String suffix)שמחזירה:prefix: message (suffix)
- מתודה
Main.java: הדגימו כיצד כל ארבע המתודות המועמסות פועלות יחד. תקבלו ארבעה קלטים: הודעה (String), מספר חזרות (int), קידומת (String) וסיומת (String). צרוMessageFormatterוקראו לכל אחת מהגרסאות של המתודהformat, תוך הדפסת כל תוצאה בשורה נפרדת:- ראשית, עצבו את ההודעה בלבד
- שנית, עצבו את ההודעה ואת מספר החזרות
- שלישית, עצבו את ההודעה ואת הקידומת
- רביעית, עצבו את ההודעה, הקידומת והסיומת
תקבלו ארבעה קלטים: טקסט ההודעה, מספר הפעמים לחזור עליה, מחרוזת קידומת ומחרוזת סיומת.
לדוגמה, אם ההודעה היא "Hello", מספר החזרות הוא 3, הקידומת היא "INFO" והסיומת היא "done", הפלט שלכם אמור להציג ארבע גרסאות מעוצבות ושונות של אותה הודעה, כאשר כל אחת מהן משתמשת במתודה מועמסת אחרת!
נסו בעצמכם
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// קראו את הקלטים
String message = scanner.nextLine();
int repeatCount = Integer.parseInt(scanner.nextLine());
String prefix = scanner.nextLine();
String suffix = scanner.nextLine();
// TODO: צרו אובייקט מסוג MessageFormatter
// TODO: קראו ל־format עם message בלבד והדפיסו את התוצאה
// TODO: קראו ל־format עם message ו־repeatCount והדפיסו את התוצאה
// TODO: קראו ל־format עם message ו־prefix והדפיסו את התוצאה
// TODO: קראו ל־format עם message, prefix ו־suffix והדפיסו את התוצאה
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין