Menu
Coddy logo textTech

מבוא למיקסינים

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

למדת ש-Dart מאפשרת להרחיב מחלקה אחת בלבד, ואף שאפשר לממש כמה ממשקים, צריך לכתוב את כל הקוד בעצמך. אבל מה אם רוצים לשתף קוד מימוש ממשי בין כמה מחלקות שאינן קשורות זו לזו? כאן נכנסים לתמונה mixins.

Mixin הוא דרך לעשות שימוש חוזר בקוד בכמה היררכיות של מחלקות. אפשר לחשוב עליו כעל אוסף של שיטות ומאפיינים שאפשר „לערבב לתוך” כל מחלקה, וכך להוסיף לה יכולות חדשות בלי להשתמש בירושה.

mixin Swimming {
  void swim() {
    print('Swimming through the water');
  }
}

class Duck with Swimming {
  void quack() {
    print('Quack!');
  }
}

class Fish with Swimming {
  void blowBubbles() {
    print('Blub blub');
  }
}

void main() {
  var duck = Duck();
  duck.quack();
  duck.swim();  // מתוך ה-mixin
  
  var fish = Fish();
  fish.swim();  // אותו מימוש, מחלקה אחרת
}

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

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

challenge icon

אתגר

קל

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

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

  • instruments.dart: הגדירו כאן את ה-mixin ואת מחלקות כלי הנגינה:
    • mixin בשם Tunable עם מתודה tune() שמדפיסה Tuning the instrument... ומתודה checkTuning() שמדפיסה Tuning is perfect!
    • מחלקה בשם Guitar שמשתמשת ב-mixin Tunable. הוסיפו מאפיין String brand עם בנאי. כללו מתודה strum() שמדפיסה [brand] guitar strumming chords
    • מחלקה בשם Piano שמשתמשת גם היא ב-mixin Tunable. הוסיפו מאפיין int keys עם בנאי. כללו מתודה play() שמדפיסה Playing [keys]-key piano
  • main.dart: ייבאו את קובץ כלי הנגינה והדגימו כיצד שני כלי הנגינה שאינם קשורים זה לזה מקבלים יכולות כוונון מאותו mixin:
    • צרו Guitar עם המותג 'Fender'
    • צרו Piano עם 88 קלידים
    • עבור הגיטרה: קראו ל-tune(), אחר כך ל-strum(), ואז ל-checkTuning()
    • הדפיסו שורה ריקה
    • עבור הפסנתר: קראו ל-tune(), אחר כך ל-play(), ואז ל-checkTuning()

שימו לב ש-Guitar ו-Piano הם כלי נגינה שונים לחלוטין, ללא קשר של ירושה ביניהם, ובכל זאת שניהם מקבלים את אותן מתודות כוונון בדיוק מה-mixin Tunable. כותבים את קוד הכוונון פעם אחת, ושתי המחלקות יכולות להשתמש בו באמצעות מילת המפתח with.

הפלט הצפוי:

Tuning the instrument...
Fender guitar strumming chords
Tuning is perfect!

Tuning the instrument...
Playing 88-key piano
Tuning is perfect!

נסו בעצמכם

import 'instruments.dart';

void main() {
  // TODO: צרו Guitar מהמותג 'Fender'
  
  // TODO: צרו Piano עם 88 קלידים
  
  // TODO: עבור הגיטרה: קראו ל־tune(), אחר כך ל־strum(), ואז ל־checkTuning()
  
  // TODO: הדפיסו שורה ריקה
  
  // TODO: עבור הפסנתר: קראו ל־tune(), אחר כך ל־play(), ואז ל־checkTuning()
}
quiz iconבחנו את עצמכם

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

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

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