Menu
Coddy logo textTech

ממשקים ב-Dart

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

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

כשאתה רוצה שמחלקה תתחייב לספק פונקציונליות מסוימת בלי לרשת מימוש, משתמשים במילת המפתח implements:

class Printer {
  void printDocument(String content) {
    print('Printing: $content');
  }
}

class Scanner {
  void scan() {
    print('Scanning document');
  }
}

// MultiFunctionDevice חייבת לממש את כל המתודות משתי המחלקות
class MultiFunctionDevice implements Printer, Scanner {
  @override
  void printDocument(String content) {
    print('MFD printing: $content');
  }
  
  @override
  void scan() {
    print('MFD scanning');
  }
}

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

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

challenge icon

אתגר

קל

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

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

  • media.dart: הגדירו כאן את מחלקות הממשק ואת המחלקה המממשת:
    • מחלקה AudioPlayer עם מתודה playAudio(String track) שמדפיסה Playing audio: [track]
    • מחלקה VideoPlayer עם מתודה playVideo(String title) שמדפיסה Playing video: [title]
    • מחלקה SmartTV שמממשת גם את AudioPlayer וגם את VideoPlayer. מכיוון ש-implements לא יורשת קוד, עליכם לספק מימושים משלכם לשתי המתודות. על SmartTV שלכם להדפיס SmartTV audio: [track] עבור שמע ו-SmartTV video: [title] עבור וידאו
  • main.dart: ייבאו את קובץ המדיה שלכם והדגימו כיצד מחלקה יחידה יכולה לממש כמה ממשקים:
    • צרו מופע של SmartTV
    • קראו ל-playAudio('Jazz Collection')
    • קראו ל-playVideo('Nature Documentary')

שימו לב שעל SmartTV לספק מימוש משלו לכל מתודה משני הממשקים — היא לא יורשת את המימושים המקוריים מ-AudioPlayer או מ-VideoPlayer. זהו ההבדל העיקרי בין implements ל-extends.

הפלט הצפוי:

SmartTV audio: Jazz Collection
SmartTV video: Nature Documentary

נסו בעצמכם

import 'media.dart';

void main() {
  // TODO: ליצור מופע של SmartTV
  
  // TODO: לקרוא ל־playAudio('Jazz Collection')
  
  // TODO: לקרוא ל־playVideo('Nature Documentary')
  
}
quiz iconבחנו את עצמכם

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

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

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