ירושה בסיסית
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 36 מתוך 110.
ירושה מאפשרת למחלקה לרכוש את המאפיינים והמתודות של מחלקה אחרת. במקום לכתוב מחדש את אותו קוד, יוצרים מחלקה חדשה שנבנית על בסיס מחלקה קיימת. המחלקה המקורית נקראת מחלקת־האב (או מחלקת־על), והמחלקה החדשה היא מחלקת־הבת (או תת־מחלקה).
ב-Dart, משתמשים במילת המפתח extends כדי לרשת ממחלקת אב:
class Animal {
String name;
Animal(this.name);
void eat() {
print('$name is eating');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
void bark() {
print('$name says woof!');
}
}
void main() {
var dog = Dog('Buddy');
dog.eat(); // עבר בירושה מ-Animal
dog.bark(); // מוגדר ב-Dog
}למחלקה Dog יש גישה אוטומטית למאפיין name ולמתודה eat() מתוך Animal, בנוסף למתודה משלה bark(). כך נוצר קשר מסוג "הוא-סוג-של" — כלב הוא בעל חיים.
מחלקת הבת יכולה להוסיף מאפיינים ומתודות חדשים, אך היא יורשת את כל מה שציבורי ממחלקת האב. שים לב שחברים פרטיים (אלה שמתחילים ב־_) אינם נגישים ישירות במחלקות יורשות מספריות שונות, אף שהם עדיין קיימים באובייקט שעבר בירושה.
אתגר
קלבואו נבנה מערכת כלי רכב שמדגימה כיצד ירושה מאפשרת למחלקות צאצא לעשות שימוש חוזר בפונקציונליות של מחלקת האב ולהרחיב אותה. תיצרו מחלקת אב לכלי רכב כלליים ומחלקת צאצא לסוג מסוים של כלי רכב.
תארגנו את הקוד שלכם בשני קבצים:
vehicle.dart: הגדירו כאן את המחלקות שלכם:- מחלקת
Vehicle(מחלקת האב) עם מאפייןString brand, בנאי שמקבל את המותג, ומתודהstart()שמדפיסה[brand] engine starting... - מחלקת
Motorcycleשיורשת מ־Vehicle. צריך להיות לה מאפיין נוסףint cc(נפח המנוע), בנאי שמקבל גם את המותג וגם את cc (ומעביר את המותג למחלקת האב באמצעותsuper), ומתודה משלהwheelie()שמדפיסה[brand] is doing a wheelie!
- מחלקת
main.dart: ייבאו את קובץ כלי הרכב שלכם והדגימו ירושה בפעולה:- צרו
Vehicleעם המותג'Toyota' - קראו למתודה
start()שלו - צרו
Motorcycleעם המותג'Harley'ועם cc בערך1200 - קראו למתודה
start()של האופנוע (שעוברת בירושה מ־Vehicle) - קראו למתודה
wheelie()של האופנוע (שמוגדרת ב־Motorcycle) - הדפיסו
Motorcycle engine: [cc]ccכדי להציג את המאפיין הייחודי של מחלקת הצאצא
- צרו
שימו לב איך מחלקת Motorcycle מקבלת אוטומטית גישה למאפיין brand ולמתודה start() מתוך Vehicle, ובמקביל יש לה מאפיין ייחודי משלה cc ומתודה משלה wheelie(). זהו כוחה של הירושה — בנייה על גבי קוד קיים.
הפלט הצפוי:
Toyota engine starting...
Harley engine starting...
Harley is doing a wheelie!
Motorcycle engine: 1200ccנסו בעצמכם
import 'vehicle.dart';
void main() {
// TODO: צרו Vehicle עם המותג 'Toyota'
// TODO: קראו למתודה start() של כלי הרכב
// TODO: צרו Motorcycle עם המותג 'Harley' ו-cc 1200
// TODO: קראו למתודה start() של האופנוע (עברה בירושה מ-Vehicle)
// TODO: קראו למתודה wheelie() של האופנוע
// TODO: הדפיסו 'Motorcycle engine: [cc]cc' באמצעות המאפיין cc של האופנוע
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין