Menu
Coddy logo textTech

ממשקים משתמעים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 46 מתוך 110.

מכיוון שכל מחלקה ב-Dart מגדירה ממשק באופן אוטומטי, אפשר להשתמש בכל מחלקה כממשק — אפילו במחלקות קונקרטיות עם מימושים מלאים. לזה אנחנו קוראים ממשק משתמע.

נבחן מחלקה עם מאפיינים ומתודות:

class Logger {
  String prefix = '[LOG]';
  
  void log(String message) {
    print('$prefix $message');
  }
  
  void clear() {
    print('Clearing logs...');
  }
}

כאשר מחלקה אחרת מממשת את Logger, עליה לספק מימוש משלה לכל דבר — כולל המאפיין prefix:

class FileLogger implements Logger {
  @override
  String prefix = '[FILE]';
  
  @override
  void log(String message) {
    print('$prefix Writing to file: $message');
  }
  
  @override
  void clear() {
    print('Deleting log file...');
  }
}

זהו הרעיון המרכזי: כשמשתמשים ב־implements, אומרים ״למחלקה שלי תהיה אותה צורה״ — אותן מתודות ותכונות. לא יורשים שום קוד, בנאים או ערכי ברירת מחדל. רק מתחייבים להתאים למבנה של הממשק.

כך ממשקים מרומזים הם כלי עוצמתי ליצירת רכיבים הניתנים להחלפה. קוד שמצפה ל־Logger יכול לעבוד עם כל מחלקה שמממשת את הממשק שלו, ללא קשר לאופן שבו המימוש פועל מבפנים.

challenge icon

אתגר

קל

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

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

  • notification.dart: הגדירו כאן את מחלקות ההתראות שלכם:
    • מחלקת Notification עם מאפיין String channel שמוגדר ל-'default', מתודה send(String message) שמדפיסה [channel]: [message], ומתודה getStatus() שמחזירה את המחרוזת 'Notification ready'
    • מחלקת EmailNotification ש-מממשת את Notification. מכיוון שאתם משתמשים ב-implements, עליכם לספק מאפיין channel משלכם (הגדירו אותו ל-'email'), מתודת send() משלכם שמדפיסה Sending email: [message], ומתודת getStatus() משלכם שמחזירה 'Email service active'
    • מחלקת PushNotification ש-מממשת את Notification. הגדירו את channel שלה ל-'push', גרמו ל-send() להדפיס Push alert: [message], ודאגו ש-getStatus() תחזיר 'Push service connected'
  • main.dart: ייבאו את קובץ ההתראות שלכם והדגימו כיצד מחלקות שונות יכולות לממש את אותו ממשק מרומז בהתנהגויות שונות לחלוטין:
    • צרו EmailNotification ו-PushNotification
    • עבור כל התראה, הדפיסו את הסטטוס שלה באמצעות getStatus(), ולאחר מכן קראו ל-send() עם ההודעה 'Hello World'
    • הדפיסו שורה ריקה בין שתי ההתראות

זכרו: כשאתם משתמשים ב-implements, אינכם יורשים שום קוד מ-Notification. אתם רק מתחייבים שלמחלקה שלכם תהיה אותה צורה — אותם מאפיינים ומתודות. כל מחלקה מממשת מספקת מימוש מלא משלה.

פלט צפוי:

Email service active
Sending email: Hello World

Push service connected
Push alert: Hello World

נסו בעצמכם

import 'notification.dart';

void main() {
  // TODO: צרו מופע של EmailNotification
  
  // TODO: הדפיסו את הסטטוס של התראת האימייל באמצעות getStatus()
  
  // TODO: שלחו את ההודעה 'Hello World' באמצעות התראת האימייל
  
  // TODO: הדפיסו שורה ריקה
  
  // TODO: צרו מופע של PushNotification
  
  // TODO: הדפיסו את הסטטוס של התראת הדחיפה באמצעות getStatus()
  
  // TODO: שלחו את ההודעה 'Hello World' באמצעות התראת הדחיפה
  
}
quiz iconבחנו את עצמכם

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

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

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