יצירת מיקסינים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 הם דרך נקייה להוסיף פונקציונליות לשימוש חוזר, בלי המורכבות של היררכיות ירושה.
אתגר
קלבואו נבנה מערכת הודעות שמדגימה איך ליצור mixins עם מתודות, מאפיינים ו-getters. תתכננו mixin שמוסיף יכולות עיצוב לסוגים שונים של הודעות.
תארגנו את הקוד שלכם בשני קבצים:
messaging.dart: הגדירו כאן את ה-mixin ואת מחלקות ההודעות:- mixin בשם
Formattableשמכיל:- מאפיין
String prefixשמאותחל ל-'>>>' - getter בשם
separatorשמחזיר' | ' - מתודה
format(String text)שמחזירה את המחרוזת[prefix][separator][text] - מתודה
formatBold(String text)שמחזירה את**[text]**
- מאפיין
- מחלקה בשם
TextMessageשמשתמשת ב-mixinFormattable. הוסיפו מאפייןString senderעם בנאי. כללו מתודהsend(String content)שמדפיסה את התוצאה של קריאה ל-format()עם[sender]: [content] - מחלקה בשם
AlertMessageשמשתמשת גם היא ב-mixinFormattable. הוסיפו מאפייןString levelעם בנאי. כללו מתודהalert(String content)שמדפיסה את התוצאה של קריאה ל-format()עם[[level]] [formatBold(content)]
- mixin בשם
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') על הודעת ההתראה
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין