מבוא למיקסינים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 אינם קשורים באמצעות ירושה, ובכל זאת שניהם זקוקים להתנהגות של שחייה. בעזרת מיקסינים, כותבים את הקוד פעם אחת ומשתפים אותו בכל מקום שבו הוא נדרש.
אתגר
קלבואו נבנה מערכת של כלי נגינה שמדגימה כיצד mixins מאפשרים לשתף התנהגות בין מחלקות שאינן קשורות זו לזו. תיצרו mixin שמספק יכולת כוונון, ואז תיישמו אותו על כלי נגינה שונים שאינם קשורים באמצעות ירושה.
תארגנו את הקוד בשני קבצים:
instruments.dart: הגדירו כאן את ה-mixin ואת מחלקות כלי הנגינה:- mixin בשם
Tunableעם מתודהtune()שמדפיסהTuning the instrument...ומתודהcheckTuning()שמדפיסהTuning is perfect! - מחלקה בשם
Guitarשמשתמשת ב-mixinTunable. הוסיפו מאפייןString brandעם בנאי. כללו מתודהstrum()שמדפיסה[brand] guitar strumming chords - מחלקה בשם
Pianoשמשתמשת גם היא ב-mixinTunable. הוסיפו מאפייןint keysעם בנאי. כללו מתודהplay()שמדפיסהPlaying [keys]-key piano
- mixin בשם
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()
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםספריות וייבואמבוא לתכנות מונחה עצמיםמחלקות לעומת אובייקטיםמילת המפתח thisמתודותמשתני מופעיסודות הבנאיחזרה: מחשבון פשוט4בטיחות מפני ערכי null
מבוא לבטיחות מפני ערכי nullניתן להקצאה ל-null לעומת לא ניתן להקצאה ל-nullהאופרטורים ? ו-!מילת המפתח Late ובטיחות מפני ערכי nullאופרטורים מודעי nullבטיחות מפני ערכי null במחלקותסיכום – מערכת פרופילי משתמשים7מחלקות מופשטות וממשקים
מחלקות מופשטותמתודות מופשטותממשקים ב-Dartממשקים משתמעיםמימוש לעומת הורשהממשקים מרוביםחזרה – מחשבון צורות10אוספים וגנריות
סקירה כללית של List, Set ו-Mapאוספים בטוחים מבחינת טיפוסיםמחלקות גנריותמתודות גנריותאילוצים גנרייםIterable ו-Iteratorסיכום – אחסון גנרי13מושגי OOP מתקדמים
הרכבה לעומת הורשהמתודות הרחבהמחלקות קריאותמחלקות אטומות (Dart 3)רשומות (Dart 3)תבניות והתאמה (3.0)טיפוסים מונים עם מתודות16פרויקט: ניהול ספרייה
סקירת הפרויקטמחלקות ספר ומשתמש2בנאים ב-Dart
בנאי ברירת מחדלבנאים בעלי שםרשימות אתחולבנאים קבועיםבנאי Factoryבנאים מפניםסיכום - בונה צורות5כימוס
חברים ציבוריים לעומת פרטייםמוסכמת הקידומת _פרטיות ברמת הספרייההעמקה ב-getters וב-settersהסתרת מידעסיכום – רשומות תלמידים8מיקסינים
מבוא למיקסיניםיצירת מיקסיניםשימוש במספר מיקסיניםמילת המפתח on במיקסיניםמיקסינים לעומת ירושהמיקסינים לעומת ממשקסיכום – מערכת בעלי החיים3מאפייני מחלקה
איברי מופע לעומת איברים סטטייםשדות final ו-constמשתני lateמתודות ושדות סטטייםGetters ו-Settersסיכום – מנהל חשבונות בנק6ירושה
ירושה בסיסיתמילת המפתח superדריסת מתודותהאנוטציה @overrideמילת המפתח final למחלקהבנאים וירושהסיכום – היררכיית עובדים9פולימורפיזם
יסודות הפולימורפיזםפולימורפיזם באמצעות ממשקיםבדיקת טיפוסים בזמן ריצההאופרטורים is ו-asמילת המפתח קווריאנטיסיכום — מעבד תשלומים12תכנות מונחה עצמים אסינכרוני
Future-ים ו-async/awaitיסודות ה-Streamsבקרי Streamsבנאים אסינכרונייםאסינכרוניות במתודות של מחלקהסיכום - אחזור נתוניםתרגלו בעצמכם: קומפיילר Dart אונליין