בנאים וירושה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 41 מתוך 110.
כאשר מחלקת צאצא מרחיבה מחלקת אב, יש לקרוא לבנאי של מחלקת האב כדי לאתחל כראוי את השדות שעברו בירושה. Dart מאפשרת דרכים גמישות לעשות זאת באמצעות רשימת המאתחלים, בעזרת super.
אם למחלקת האב יש בנאי עם פרמטרים, מחלקת הבת חייבת לקרוא לו במפורש:
class Person {
String name;
int age;
Person(this.name, this.age);
}
class Student extends Person {
String school;
Student(String name, int age, this.school) : super(name, age);
}ב־Dart 2.17 הוצגו פרמטרים של super, תחביר נקי יותר שמעביר פרמטרים ישירות לבנאי של מחלקת האב:
class Student extends Person {
String school;
// super.name ו-super.age מועברים ישירות לבנאי של Person
Student(super.name, super.age, this.school);
}בעבודה עם בנאים בעלי שם, מציינים לאיזה בנאי של מחלקת האב לקרוא:
class Employee extends Person {
String department;
Employee(super.name, super.age, this.department);
Employee.intern(String name, this.department) : super(name, 18);
}הכלל המרכזי פשוט: יש לאתחל את מחלקת האב במלואה לפני שמחלקת הבת מוסיפה מאפיינים משלה. בין אם משתמשים בקריאה המסורתית super() ובין אם בפרמטרי super החדשים יותר, Dart מוודאת ששרשרת הירושה נבנית כראוי ממחלקת האב למחלקת הבת.
אתגר
קלבואו נבנה מערכת לניהול מלאי של מוצרים שמדגימה כיצד בנאים פועלים עם הורשה. תיצרו היררכיה שבה סוגי מוצרים שונים יורשים מחלקת בסיס של מוצר, וכל אחד מהם דורש אתחול מתאים באמצעות הבנאים של מחלקות האב.
תארגנו את הקוד בשני קבצים:
product.dart: הגדירו כאן את היררכיית המוצרים:- מחלקת
Productעם המאפייניםString nameו-double price, בנאי שמקבל את שני הערכים, ומתודהinfo()שמדפיסה[name]: $[price] - מחלקת
Bookשיורשת מ-Productומוסיפה מאפייןString author. השתמשו בפרמטרים של super כדי להעביר אתnameואתpriceלבנאי של מחלקת האב - מחלקת
Electronicsשיורשת מ-Productומוסיפה מאפייןint warranty(בחודשים). השתמשו בקריאה המסורתיתsuper()ברשימת האתחול כדי להעביר ערכים למחלקת האב
- מחלקת
main.dart: ייבאו את קובץ המוצרים והדגימו את שתי הגישות להורשת בנאים:- צרו
Bookעם השם'Dart Essentials', המחיר29.99והמחבר'Jane Smith' - קראו למתודה
info()שלו, ואז הדפיסוAuthor: [author] - הדפיסו שורה ריקה
- צרו
Electronicsעם השם'Wireless Mouse', המחיר45.50והאחריות24 - קראו למתודה
info()שלו, ואז הדפיסוWarranty: [warranty] months
- צרו
שתי מחלקות הבן יורשות את המתודה info() מ-Product בלי צורך לדרוס אותה. ההבדל העיקרי הוא באופן שבו הן קוראות לבנאי של מחלקת האב — Book משתמשת בתחביר הנקי יותר של פרמטרים של super, ואילו Electronics משתמשת בגישה המסורתית, עם super() ברשימת האתחול.
פלט צפוי:
Dart Essentials: $29.99
Author: Jane Smith
Wireless Mouse: $45.5
Warranty: 24 monthsנסו בעצמכם
import 'product.dart';
void main() {
// TODO: צרו אובייקט מסוג Book עם:
// - name: 'Dart Essentials'
// - price: 29.99
// - author: 'Jane Smith'
// TODO: קראו למתודה info() של הספר
// TODO: הדפיסו "Author: [author]"
// TODO: הדפיסו שורה ריקה
// TODO: צרו אובייקט מסוג Electronics עם:
// - name: 'Wireless Mouse'
// - price: 45.50
// - warranty: 24
// TODO: קראו למתודה info() של מוצר האלקטרוניקה
// TODO: הדפס "Warranty: [warranty] months"
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין