Menu
Coddy logo textTech

מחלקות מופשטות

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

challenge icon

אתגר

קל

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

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

  • 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() עבור האופנוע
}
quiz iconבחנו את עצמכם

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

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

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