Menu
Coddy logo textTech

מילת המפתח 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

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

challenge icon

אתגר

קל

בואו נבנה מערכת כלי רכב שמדגימה כיצד מילת המפתח 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 ומשתמשת ב-mixin TurboBoost. הוסיפו מאפיין String color. הבנאי צריך לקבל model, speed ו-color. כללו מתודה showOff() שמדפיסה [color] [model] ready to race!
  • main.dart: ייבאו את קובץ כלי הרכב שלכם והדגימו כיצד ה-mixin המוגבל פועל:
    • צרו SportsCar עם model 'Ferrari', speed 320 ו-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()
}
quiz iconבחנו את עצמכם

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

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

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