Menu
Coddy logo textTech

מתודות ברירת מחדל וסטטיות בממשק

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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);

אי אפשר לדרוס מתודות ממשק סטטיות, והן אינן עוברות בירושה למחלקות שמממשות את הממשק. הן שימושיות עבור מתודות שירות הקשורות למטרת הממשק.

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

challenge icon

אתגר

קל

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

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

  • 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 עם ההודעה המעוצבת
    }
}
quiz iconבחנו את עצמכם

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

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

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