מתודות ברירת מחדל וסטטיות בממשק
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 37 מתוך 87.
במקור, ממשקים יכלו להכיל רק מתודות מופשטות ללא מימוש. החל מ-Java 8, ממשקים קיבלו את היכולת לכלול מתודות ברירת מחדל ו-מתודות סטטיות, מה שהפך אותם לגמישים יותר.
מתודה ברירת מחדל מספקת מימוש ישירות בממשק באמצעות מילת המפתח default. מחלקות שמממשות את הממשק יורשות את ההתנהגות הזאת באופן אוטומטי, אך יכולות לדרוס אותה במידת הצורך:
public interface Drawable {
void draw();
default void display() {
System.out.println("Displaying on screen...");
draw();
}
}כל מחלקה שמממשת את Drawable מקבלת את המתודה display() בחינם. הדבר שימושי במיוחד להוספת מתודות חדשות לממשקים קיימים בלי לשבור מחלקות שכבר מממשות אותם.
מתודות סטטיות בממשקים פועלות כמו מתודות סטטיות במחלקות. הן שייכות לממשק עצמו ונקראות באמצעות שם הממשק:
public interface MathOperations {
static int add(int a, int b) {
return a + b;
}
}
// שימוש
int result = MathOperations.add(5, 3);אי אפשר לדרוס מתודות ממשק סטטיות, והן אינן עוברות בירושה למחלקות שמממשות את הממשק. הן שימושיות עבור מתודות שירות הקשורות למטרת הממשק.
אם מחלקה מממשת שני ממשקים עם אותה חתימה של מתודת ברירת מחדל, על המחלקה לדרוס את המתודה כדי לפתור את ההתנגשות.
אתגר
קלבואו נבנה מערכת הודעות שמדגימה הן שיטות ברירת מחדל והן שיטות סטטיות בממשקים. תיצרו ממשק עם פונקציונליות מובנית שהמחלקות שמממשות אותו יכולות להשתמש בה ישירות או להתאים אותה לפי הצורך.
תארגנו את הקוד בארבעה קבצים:
Messenger.java: הגדירו ממשק שמייצג כל שירות הודעות. עליו להצהיר על שיטה מופשטתsendMessage(String message)שמחזירה void. הוסיפו שיטת ברירת מחדל בשםsendWithTimestamp(String message)שמדפיסה:[TIMESTAMP]ולאחר מכן קוראת ל־sendMessage(message). כללו גם שיטה סטטית בשםformatMessage(String message)שמחזירה את ההודעה כשהיא מומרת לאותיות גדולות.EmailMessenger.java: צרו מחלקה שמממשת אתMessenger. יש לה שדהrecipient(String). כללו בנאי לאתחול הנמען. ממשו אתsendMessage()כך שתדפיס:Email to [recipient]: [message]. המחלקה משתמשת בשיטת ברירת המחדלsendWithTimestamp()כפי שהיא.SMSMessenger.java: צרו מחלקה נוספת שמממשת אתMessenger. יש לה שדהphoneNumber(String). כללו בנאי לאתחול מספר הטלפון. ממשו אתsendMessage()כך שתדפיס:SMS to [phoneNumber]: [message]. דרסו את שיטת ברירת המחדלsendWithTimestamp()כך שתדפיס:[URGENT]ולאחר מכן תקרא ל־sendMessage(message), במקום להשתמש בהתנהגות ברירת המחדל של חותמת הזמן.Main.java: חברו את הכול יחד כדי להדגים שיטות ממשק של ברירת מחדל וסטטיות. תקבלו שלוש קלטים: נמען של כתובת דוא"ל, מספר טלפון והודעה. תחילה, השתמשו בשיטה הסטטיתMessenger.formatMessage()כדי לעצב את ההודעה ולשמור אותה. לאחר מכן צרו EmailMessenger ו־SMSMessenger. עבור כל אחד משירותי ההודעות, קראו ל־sendWithTimestamp()עם ההודעה המעוצבת: שימו לב ש־EmailMessenger משתמש במימוש ברירת המחדל, ואילו SMSMessenger משתמש בגרסה שדרס.
תקבלו שלוש קלטים: נמען של כתובת הדוא"ל (String), מספר הטלפון (String) וההודעה (String).
הפלט שלכם צריך להציג ארבע שורות בסך הכול: שתיים עבור כל שירות הודעות: שורת קידומת ([TIMESTAMP] או [URGENT]) ואחריה שורת ההודעה. EmailMessenger יציג את קידומת חותמת הזמן שמוגדרת כברירת מחדל, ואילו SMSMessenger יציג את קידומת הדחיפות המותאמת אישית שלו. שניהם ישתמשו בהודעה שעוצבה סטטית (באותיות גדולות)!
נסו בעצמכם
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// קרא את הקלטים
String emailRecipient = scanner.nextLine();
String phoneNumber = scanner.nextLine();
String message = scanner.nextLine();
// TODO: השתמש ב-Messenger.formatMessage() כדי לעצב את ההודעה ולאחסן אותה
// TODO: צור EmailMessenger עם כתובת הדוא״ל של הנמען
// TODO: צור SMSMessenger עם מספר הטלפון
// TODO: קרא ל-sendWithTimestamp() של EmailMessenger עם ההודעה המעוצבת
// TODO: קרא ל-sendWithTimestamp() של SMSMessenger עם ההודעה המעוצבת
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין