Menu
Coddy logo textTech

מיקסינים לעומת ירושה

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

עכשיו, אחרי שלמדת איך מיקסינים עובדים, נבהיר מתי להשתמש בהם במקום בירושה. ההבדל העיקרי טמון בקשר שהם מבטאים.

ירושה מייצגת קשר של "is-a". Dog הוא Animal. תת־המחלקה היא גרסה מיוחדת של מחלקת האב, ואפשר להרחיב רק מחלקה אחת.

Mixins, לעומת זאת, מייצגים קשר של "יכול לעשות". כלב Dog יכול לשחות, אבל שחייה היא לא מה שמגדיר כלב.

// ירושה: Dog הוא Animal
class Animal {
  String name;
  Animal(this.name);
}

class Dog extends Animal {
  Dog(String name) : super(name);
}

// Mixin: Dog יכול לשחות (אבל אינו מוגדר לפי יכולתו לשחות)
mixin Swimming {
  void swim() => print('Swimming');
}

class Dog extends Animal with Swimming {
  Dog(String name) : super(name);
}

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

מאפייןירושהMixin
יחסהוא סוג שליכול לבצע
מגבלההורה אחד בלבדכמה mixins
בנאיםמותריםאינם מותרים
מקרה שימושהתמחותהתנהגות משותפת

החלק הכי טוב? אפשר לשלב בין שניהם — להרחיב מחלקה אחת ולשלב כמה יכולות, כך שהמחלקות שלך יקבלו בדיוק את התכונות שהן צריכות.

challenge icon

אתגר

קל

בואו נבנה מערכת עובדים שמדגימה מתי להשתמש בירושה לעומת מיקסינים. תיצרו מחלקת בסיס עבור היחס "הוא-סוג-של" ומיקסינים עבור יכולות "יכול-לעשות", ואז תשלבו ביניהם כדי להראות איך שתי הגישות פועלות יחד.

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

  • worker.dart: הגדירו מחלקת בסיס שמבססת את הזהות המרכזית של כל העובדים:
    • מחלקת Worker עם המאפיינים String name ו-String department. כללו בנאי שמקבל את שני הערכים. הוסיפו שיטה introduce() שמדפיסה [name] works in [department]
  • skills.dart: הגדירו מיקסינים שמייצגים יכולות שעובדים יכולים להחזיק (יחסי "יכול-לעשות"):
    • מיקסין CanCode עם שיטה writeCode() שמדפיסה Writing code...
    • מיקסין CanDesign עם שיטה createDesign() שמדפיסה Creating design...
    • מיקסין CanManage עם שיטה leadTeam() שמדפיסה Leading the team...
  • main.dart: ייבאו את שני הקבצים וצרו סוגי עובדים ייעודיים המשלבים ירושה עם מיקסינים:
    • מחלקת Developer שמרחיבה את Worker ומשתמשת במיקסין CanCode
    • מחלקת TechLead שמרחיבה את Worker ומשתמשת במיקסינים CanCode ו-CanManage
    • צרו Developer בשם 'Alice' במחלקה 'Engineering'
    • צרו TechLead בשם 'Bob' במחלקה 'Engineering'
    • עבור Alice: קראו ל-introduce() ואז ל-writeCode()
    • הדפיסו שורה ריקה
    • עבור Bob: קראו ל-introduce(), ואז ל-writeCode(), ואז ל-leadTeam()

שימו לב שגם Developer וגם TechLead הם עובדים (ירושה), אבל הם יכולים לעשות דברים שונים (מיקסינים). TechLead משלב כמה יכולות בלי להזדקק לירושה מרובה.

פלט צפוי:

Alice works in Engineering
Writing code...

Bob works in Engineering
Writing code...
Leading the team...

נסו בעצמכם

import 'worker.dart';
import 'skills.dart';

// TODO: צרו מחלקת Developer שיורשת מ-Worker ומשתמשת ב-mixin ‏CanCode

// TODO: צרו מחלקת TechLead שיורשת מ-Worker ומשתמשת בשני ה-mixins ‏CanCode ו-CanManage

void main() {
  // TODO: צרו Developer בשם 'Alice' במחלקת 'Engineering'
  
  // TODO: קראו ל-introduce() ואז ל-writeCode() עבור Alice
  
  // TODO: הדפיסו שורה ריקה
  
  // TODO: צרו TechLead בשם 'Bob' במחלקת 'Engineering'
  
  // TODO: קראו ל-introduce(), אחר כך ל-writeCode(), ואז ל-leadTeam() עבור Bob
}
quiz iconבחנו את עצמכם

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

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

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