מילת המפתח on במיקסינים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 53 מתוך 110.
לפעמים mixin צריך להשתמש במתודות או במאפיינים של המחלקה שמשלבים אותו בה. מילת המפתח on מאפשרת לך להגביל mixin כך שאפשר יהיה להשתמש בו רק עם מחלקות שמרחיבות טיפוס מסוים.
class Animal {
String name;
Animal(this.name);
void breathe() => print('$name is breathing');
}
mixin Swimming on Animal {
void swim() {
print('$name is swimming'); // ניתן לגשת ל-'name' מתוך Animal
breathe(); // ניתן לקרוא למתודות של Animal
}
}
class Fish extends Animal with Swimming {
Fish(String name) : super(name);
}ההכרזה on Animal פירושה שאפשר להחיל את המיקסין הזה רק על מחלקות שמרחיבות את Animal. כך מובטח שלמיקסין תהיה גישה לחברים של Animal. בלי on, המיקסין לא היה יודע שקיימים name או breathe().
אם תנסה להשתמש ב-mixin מוגבל במחלקה שאינה תואמת, Dart תציג שגיאת זמן הידור:
class Robot with Swimming {} // שגיאה! Robot לא יורש מ־Animalהאילוץ הזה שימושי כאשר הפונקציונליות של המיקסין שלך תלויה ביכולות מסוימות של מחלקת בסיס. הוא יוצר חוזה בטוח יותר — המיקסין מבטיח התנהגות מסוימת, אבל רק כשיש לו את הבסיס הדרוש כדי לפעול כראוי.
אתגר
קלבואו נבנה מערכת כלי רכב שמדגימה כיצד מילת המפתח on מגבילה mixins כך שיעבדו רק עם מחלקות בסיס ספציפיות. תיצרו mixin שמוסיף פונקציונליות של טורבו, אבל אפשר להשתמש בו רק במחלקות שמרחיבות את מחלקת הבסיס Vehicle.
תארגנו את הקוד שלכם בשני קבצים:
vehicles.dart: הגדירו כאן את מחלקת הבסיס, את ה-mixin המוגבל ואת סוגי כלי הרכב:- מחלקת
Vehicleעם מאפייןString modelומאפייןint speed. כללו בנאי שמקבל את שני הערכים. הוסיפו מתודהaccelerate()שמדפיסה[model] accelerating to [speed] km/h - mixin בשם
TurboBoostשמוגבל ל-Vehicleבאמצעות מילת המפתחon. ל-mixin הזה צריכה להיות מתודהactivateTurbo()שמדפיסה[model] TURBO ACTIVATED!ואז קוראת ל-accelerate()(לשתיהן ניתן לגשת בזכות האילוץon Vehicle) - מחלקת
SportsCarשמרחיבה אתVehicleומשתמשת ב-mixinTurboBoost. הוסיפו מאפייןString color. הבנאי צריך לקבל model, speed ו-color. כללו מתודהshowOff()שמדפיסה[color] [model] ready to race!
- מחלקת
main.dart: ייבאו את קובץ כלי הרכב שלכם והדגימו כיצד ה-mixin המוגבל פועל:- צרו
SportsCarעם model'Ferrari', speed320ו-color'Red' - קראו ל-
showOff() - קראו ל-
activateTurbo()
- צרו
ה-mixin TurboBoost יכול לגשת אל model ולקרוא ל-accelerate() משום שההצהרה on Vehicle מבטיחה שהוא ישולב רק במחלקות שמרחיבות את Vehicle. כך נוצר חוזה בטוח, שבו ה-mixin יודע בדיוק אילו יכולות זמינות לו.
הפלט הצפוי:
Red Ferrari ready to race!
Ferrari TURBO ACTIVATED!
Ferrari accelerating to 320 km/hנסו בעצמכם
import 'vehicles.dart';
void main() {
// TODO: צור SportsCar עם דגם 'Ferrari', מהירות 320 וצבע 'Red'
// TODO: קרא ל-showOff()
// TODO: קרא ל-activateTurbo()
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין