Menu
Coddy logo textTech

טיפוסים מונים עם מתודות

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

ב-Dart, enums הם לא רק רשימות פשוטות של קבועים — יכולים להיות להם שדות, בנאים ומתודות, מה שהופך אותם למחלקות קטנות ועוצמתיות. זה נקרא enums מורחבים, וזה מאפשר לך לצרף התנהגות ונתונים ישירות לכל ערך של enum.

enum Status {
  pending('Waiting'),
  approved('Accepted'),
  rejected('Denied');

  final String displayName;
  
  const Status(this.displayName);
  
  bool get isFinalized => this == approved || this == rejected;
}

void main() {
  var status = Status.pending;
  print(status.displayName);    // Waiting
  print(status.isFinalized);    // false
  
  print(Status.approved.isFinalized);  // true
}

כל ערך במניית enum קורא לבנאי עם הארגומנטים הספציפיים שלו. הבנאי חייב להיות const, וכל השדות חייבים להיות final. אפשר להוסיף getters ומתודות שעובדים עם הנתונים של ה-enum או משווים לערכים אחרים.

טיפוסים מורחבים של enum יכולים גם לממש ממשקים, מה שמעניק להם גמישות רבה עוד יותר:

enum Priority implements Comparable<Priority> {
  low(1),
  medium(2),
  high(3);

  final int level;
  const Priority(this.level);

  @override
  int compareTo(Priority other) => level.compareTo(other.level);
}

void main() {
  var tasks = [Priority.high, Priority.low, Priority.medium];
  tasks.sort();
  print(tasks);  // [Priority.low, Priority.medium, Priority.high]
}

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

challenge icon

אתגר

קל

בואו נבנה מערכת לניהול משימות באמצעות enums מורחבים! תיצרו enum שמייצג קטגוריות שונות של משימות, ולכל קטגוריה יהיו מאפיינים והתנהגויות משלה שיעזרו לארגן ולתעדף את העבודה.

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

  • task_category.dart: צרו enum מורחב בשם TaskCategory שמייצג סוגים שונים של משימות בפרויקט. לכל קטגוריה צריכים להיות:
    • שדה String label עבור שם קריא לבני אדם
    • שדה int priority (כאשר 1 היא העדיפות הגבוהה ביותר ו-3 היא הנמוכה ביותר)
    • בנאי const שמאתחל את שני השדות
    • ארבעה ערכי enum: bug (תווית: "Bug Fix", עדיפות: 1), feature (תווית: "New Feature", עדיפות: 2), documentation (תווית: "Documentation", עדיפות: 3), ו-testing (תווית: "Testing", עדיפות: 2)
    • getter בשם isUrgent שמחזיר true אם העדיפות היא 1
    • מתודה describe() שמחזירה מחרוזת בפורמט: [label] (Priority: [priority])
    ה-enum שלכם צריך גם לממש את Comparable<TaskCategory> כדי שאפשר יהיה למיין משימות לפי עדיפות (מספר עדיפות נמוך יותר מופיע קודם).
  • main.dart: ייבאו את ה-enum של קטגוריות המשימות והדגימו את היכולות שלו:
    • צרו רשימה שמכילה את כל ארבע קטגוריות המשימות בסדר הזה: feature, bug, documentation, testing
    • הדפיסו את התיאור של כל קטגוריה באמצעות המתודה describe(), אחד בכל שורה
    • הדפיסו שורה ריקה
    • מיינו את הרשימה לפי עדיפות והדפיסו After sorting by priority:
    • הדפיסו את התווית של כל קטגוריה ממוינת, אחת בכל שורה
    • הדפיסו שורה ריקה
    • הדפיסו Urgent tasks:
    • עברו בלולאה על הסדר המקורי (feature, bug, documentation, testing) והדפיסו רק את התוויות של הקטגוריות שעבורן isUrgent הוא true

האתגר הזה משלב תכונות של enum מורחב: שדות, בנאים, getters, מתודות ומימוש ממשקים — כולם פועלים יחד כדי ליצור מערכת שימושית לסיווג משימות!

הפלט הצפוי:

New Feature (Priority: 2)
Bug Fix (Priority: 1)
Documentation (Priority: 3)
Testing (Priority: 2)

After sorting by priority:
Bug Fix
New Feature
Testing
Documentation

Urgent tasks:
Bug Fix

נסו בעצמכם

import 'task_category.dart';

void main() {
  // TODO: צרו רשימה המכילה את כל ארבע קטגוריות המשימות בסדר הזה:
  // feature, bug, documentation, testing
  
  // TODO: הדפיסו את התיאור של כל קטגוריה באמצעות describe(), אחד בכל שורה
  
  // TODO: הדפיסו שורה ריקה
  
  // TODO: מיינו את הרשימה לפי עדיפות
  
  // TODO: הדפיסו "After sorting by priority:"
  
  // TODO: הדפיסו את התווית של כל קטגוריה ממוינת, אחת בכל שורה
  
  // TODO: הדפיסו שורה ריקה
  
  // TODO: הדפיסו "Urgent tasks:"
  
  // TODO: עברו על הסדר המקורי (feature, bug, documentation, testing)
  // והדפיסו רק את התוויות של הקטגוריות שעבורן isUrgent הוא true
}
quiz iconבחנו את עצמכם

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

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

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