טיפוסים מונים עם מתודות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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]
}טיפוסים מנוים מורחבים מתאימים במיוחד כשיש לך קבוצה קבועה של ערכים, שכל אחד מהם צריך נתונים או התנהגות משויכים — כמו קודי סטטוס עם הודעות, עדיפויות עם רמות או כיוונים עם קואורדינטות.
אתגר
קלבואו נבנה מערכת לניהול משימות באמצעות 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])
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
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין