Menu
Coddy logo textTech

מימושי ברירת מחדל

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 31 מתוך 61.

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

במקום לסיים את חתימת המתודה בנקודה-פסיק, מוסיפים לה גוף:

trait Greet {
    fn greet(&self) -> String {
        String::from("Hello there!")
    }
}

כעת כל טיפוס שמממש את Greet מקבל את המתודה הזאת באופן אוטומטי, בלי לכתוב שום קוד בבלוק impl:

struct Guest;

impl Greet for Guest {}

let visitor = Guest;
println!("{}", visitor.greet());  // שלום לך!

ה־impl Greet for Guest {} הריק תקין, משום שה־trait כבר מספק את ההתנהגות. המבנה פשוט "מצטרף" ל־trait ומקבל את המתודה שמוגדרת כברירת מחדל בחינם.

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

challenge icon

אתגר

קל

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

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

  • notifiable.rs: הגדירו trait ציבורי בשם Notifiable עם מתודה notify(&self) -> String שיש לה מימוש ברירת מחדל. ברירת המחדל צריכה להחזיר "You have a new notification!". כל טיפוס שיממש את ה-trait הזה יקבל את ההתנהגות הזאת באופן אוטומטי, בלי צורך לכתוב דבר בבלוק ה-impl שלו.
  • alerts.rs: צרו שתי יחידות struct ציבוריות ופשוטות שמממשות את ה-trait שלכם:
    • EmailAlert: מממשת את Notifiable באמצעות בלוק impl ריק (משתמשת בברירת המחדל)
    • SystemAlert: גם היא מממשת את Notifiable באמצעות בלוק impl ריק (משתמשת בברירת המחדל)
    שתי היחידות יקבלו באופן אוטומטי את הודעת ההתראה של ברירת המחדל, בלי שתכתבו גופים של מתודות!
  • main.rs: חברו את המודולים שלכם והדגימו כיצד שני סוגי ההתראות חולקים את אותה התנהגות ברירת מחדל. צרו מופעים של שתי היחידות וקראו למתודות notify שלהן.

בקובץ הראשי שלכם, צרו EmailAlert וגם SystemAlert, ואז הדפיסו את ההתראות שלהם בשורות נפרדות.

הפלט שלכם אמור להיות:

You have a new notification!
You have a new notification!

שימו לב ששני הטיפוסים מפיקים פלט זהה: זהו היופי שבמימושי ברירת מחדל! אף אחת מהיחידות לא הייתה צריכה לכתוב קוד עבור המתודה notify, ובכל זאת לשתיהן יש התנהגות התראות מתפקדת במלואה. בשיעור הבא תלמדו כיצד לדרוס את ברירות המחדל האלה כשטיפוס זקוק להתנהגות מותאמת אישית.

נסו בעצמכם

mod notifiable;
mod alerts;

use notifiable::Notifiable;
use alerts::{EmailAlert, SystemAlert};

fn main() {
    // TODO: צור מופע של EmailAlert
    
    // TODO: צור מופע של SystemAlert
    
    // TODO: הדפס את ההתראה מ-EmailAlert
    
    // TODO: הדפס את ההתראה מ-SystemAlert
}
quiz iconבחנו את עצמכם

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

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

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