מימושי ברירת מחדל
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 ומקבל את המתודה שמוגדרת כברירת מחדל בחינם.
התבנית הזאת שימושית כשאתה רוצה להגדיר התנהגות משותפת שמתאימה לרוב המקרים. טיפוסים שצריכים משהו שונה יכולים לדרוס את ברירת המחדל (את זה תלמד בהמשך), בעוד שטיפוסים שמרוצים מההתנהגות הרגילה לא צריכים לחזור על עצמם.
אתגר
קלבואו נחקור את העוצמה של מימושי ברירת מחדל באמצעות בניית מערכת התראות! תיצרו 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
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מתודות והתנהגות
מבוא לבלוקי מימושהפרמטר selfמתודות ניתנות לשינויפונקציות משויכותבלוקי מימוש מרוביםשרשור מתודותסיכום – פעולות מלבן4פרויקט: חיית מחמד וירטואלית
הגדרת חיית המחמדהאכלת חיית המחמד3Enums מתקדמים
Enums עם נתוניםמתודות ב-Enumsהתאמה של וריאנטים עם נתוניםחזרה על ה-Option Enumסיכום - ה-Shape Enum6הגדרת Traits
מהו Trait?מימוש Traitsמימושי ברירת מחדלדריסת ברירות מחדלTraits עם פרמטריםחזרה — נגן מדיהתרגלו בעצמכם: קומפיילר Rust אונליין