מחלקות מופשטות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 43 מתוך 110.
מחלקה אבסטרקטית היא מחלקה שלא ניתן ליצור ממנה מופע ישירות. היא משמשת כתבנית למחלקות אחרות ומגדירה מבנה משותף שעל מחלקות יורשות לפעול לפיו. יוצרים אותה באמצעות מילת המפתח abstract.
abstract class Shape {
String color;
Shape(this.color);
void describe() {
print('A $color shape');
}
}
class Circle extends Shape {
double radius;
Circle(String color, this.radius) : super(color);
}
void main() {
// Shape s = Shape('red'); // שגיאה! אי אפשר ליצור מופע של מחלקה מופשטת
var circle = Circle('blue', 5.0);
circle.describe(); // צורה כחולה
}מחלקות מופשטות שימושיות כשיש לך מושג כללי מדי מכדי להתקיים בפני עצמו. "צורה" היא רעיון, אבל אי אפשר לצייר צורה בלי לדעת אם היא עיגול, מלבן או משולש. המחלקה המופשטת מגדירה את המאפיינים המשותפים לכל הצורות, בעוד שתתי־מחלקות קונקרטיות מספקות את הפרטים הספציפיים.
שימו לב שמחלקות מופשטות עדיין יכולות לכלול מתודות רגילות עם מימושים (כמו describe()) ובנאים. מחלקות משנה יורשות אותם בדיוק כמו בירושה רגילה. ההבדל העיקרי הוא שפשוט אי אפשר ליצור מופע של המחלקה המופשטת עצמה — חייבים להשתמש במחלקת משנה קונקרטית.
אתגר
קלבואו נבנה מערכת כלי רכב שמדגימה כיצד מחלקות מופשטות משמשות כתוכניות אב לסוגים ספציפיים יותר. תיצרו מחלקת בסיס מופשטת שמגדירה את המאפיינים המשותפים לכל כלי הרכב, ואז תרחיבו אותה באמצעות סוגי כלי רכב קונקרטיים.
תארגנו את הקוד בשני קבצים:
vehicle.dart: הגדירו כאן את היררכיית כלי הרכב שלכם:abstract class Vehicleעם מאפיינים מסוגString brandו-int year. הוסיפו בנאי שמקבל את שני הערכים האלה ומתודהdisplayInfo()שמדפיסה[brand] ([year])- מחלקת
Carשמרחיבה אתVehicleומוסיפה מאפייןint doors. הוסיפו מתודהhonk()שמדפיסהBeep beep! - מחלקת
Motorcycleשמרחיבה אתVehicleומוסיפה מאפייןbool hasSidecar. הוסיפו מתודהrevEngine()שמדפיסהVroom!
main.dart: ייבאו את קובץ כלי הרכב שלכם והדגימו כיצד מחלקות מופשטות פועלות:- צרו
Carעם המותג'Toyota', השנה2022ומספר הדלתות4 - קראו למתודה
displayInfo()שלו (שעברה בירושה מ-Vehicle) - הדפיסו
Doors: [doors] - קראו למתודה
honk()שלו - הדפיסו שורה ריקה
- צרו
Motorcycleעם המותג'Harley', השנה2021ועםfalseעבור hasSidecar - קראו למתודה
displayInfo()שלו - הדפיסו
Has sidecar: [hasSidecar] - קראו למתודה
revEngine()שלו
- צרו
זכרו שאי אפשר ליצור מופע של Vehicle ישירות, מכיוון שהיא מופשטת — עליכם להשתמש באחת מתת-המחלקות הקונקרטיות. גם Car וגם Motorcycle יורשות את המתודה displayInfo() ממחלקת האב המופשטת.
הפלט הצפוי:
Toyota (2022)
Doors: 4
Beep beep!
Harley (2021)
Has sidecar: false
Vroom!נסו בעצמכם
import 'vehicle.dart';
void main() {
// TODO: צור Car עם מותג 'Toyota', שנת ייצור 2022 ו-4 דלתות
// TODO: קרא ל-displayInfo() עבור המכונית
// TODO: הדפס "Doors: [doors]"
// TODO: קרא ל-honk() עבור המכונית
// TODO: הדפס שורה ריקה
// TODO: צור Motorcycle עם מותג 'Harley', שנת ייצור 2021 ו-hasSidecar בערך false
// TODO: קרא ל-displayInfo() עבור האופנוע
// TODO: הדפס "Has sidecar: [hasSidecar]"
// TODO: קרא ל-revEngine() עבור האופנוע
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין