Menu
Coddy logo textTech

יצירת מיקסינים

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

עכשיו, כשאתם מבינים מהן mixins, בואו נראה איך ליצור אותן כראוי. mixin מוכרז באמצעות מילת המפתח mixin במקום class.

mixin Logging {
  void log(String message) {
    print('[LOG] $message');
  }
  
  void logError(String error) {
    print('[ERROR] $error');
  }
}

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

mixin Timestamped {
  DateTime createdAt = DateTime.now();
  
  String get formattedTime => createdAt.toString();
  
  void printTimestamp() {
    print('Created at: $formattedTime');
  }
}

class Document with Timestamped {
  String title;
  Document(this.title);
}

void main() {
  var doc = Document('Report');
  doc.printTimestamp();  // משתמש במתודה של ה-mixin
  print(doc.createdAt);  // משתמש במאפיין של ה-mixin
}

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

challenge icon

אתגר

קל

בואו נבנה מערכת הודעות שמדגימה איך ליצור mixins עם מתודות, מאפיינים ו-getters. תתכננו mixin שמוסיף יכולות עיצוב לסוגים שונים של הודעות.

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

  • messaging.dart: הגדירו כאן את ה-mixin ואת מחלקות ההודעות:
    • mixin בשם Formattable שמכיל:
      • מאפיין String prefix שמאותחל ל-'>>>'
      • getter בשם separator שמחזיר ' | '
      • מתודה format(String text) שמחזירה את המחרוזת [prefix][separator][text]
      • מתודה formatBold(String text) שמחזירה את **[text]**
    • מחלקה בשם TextMessage שמשתמשת ב-mixin Formattable. הוסיפו מאפיין String sender עם בנאי. כללו מתודה send(String content) שמדפיסה את התוצאה של קריאה ל-format() עם [sender]: [content]
    • מחלקה בשם AlertMessage שמשתמשת גם היא ב-mixin Formattable. הוסיפו מאפיין String level עם בנאי. כללו מתודה alert(String content) שמדפיסה את התוצאה של קריאה ל-format() עם [[level]] [formatBold(content)]
  • main.dart: ייבאו את קובץ ההודעות שלכם והדגימו איך שני סוגי ההודעות מקבלים יכולות עיצוב מה-mixin:
    • צרו TextMessage עם השולח 'Alice'
    • צרו AlertMessage עם הרמה 'WARNING'
    • קראו ל-send('Hello there!') בהודעת הטקסט
    • קראו ל-alert('System overload') בהודעת ההתראה

ה-mixin שלכם מדגים ש-mixins יכולים להכיל מאפיינים עם ערכי ברירת מחדל, getters שמחשבים ערכים ומתודות מרובות שאף יכולות לקרוא זו לזו. שתי מחלקות ההודעות מקבלות את כל היכולות האלה פשוט באמצעות מילת המפתח with.

פלט צפוי:

>>> | Alice: Hello there!
>>> | [WARNING] **System overload**

נסו בעצמכם

import 'messaging.dart';

void main() {
  // TODO: צרו TextMessage עם השולחת 'Alice'
  
  // TODO: צרו AlertMessage עם הרמה 'WARNING'
  
  // TODO: קראו ל־send('Hello there!') על הודעת הטקסט
  
  // TODO: קראו ל־alert('System overload') על הודעת ההתראה
}
quiz iconבחנו את עצמכם

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

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

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