Menu
Coddy logo textTech

בנאים וירושה

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 מוודאת ששרשרת הירושה נבנית כראוי ממחלקת האב למחלקת הבת.

challenge icon

אתגר

קל

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

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

  • 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"
}
quiz iconבחנו את עצמכם

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

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

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