Menu
Coddy logo textTech

האופרטורים is ו-as

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 60 מתוך 110.

בעוד ש-runtimeType מציין לך את הסוג המדויק, Dart מספקת שני אופרטורים מעשיים יותר לבדיקת סוג ולהמרת טיפוסים: is ו-as.

האופרטור is בודק אם אובייקט הוא מטיפוס מסוים ומחזיר ערך בוליאני. בניגוד ל־runtimeType, הוא מחזיר גם true עבור טיפוסי־אב:

class Animal {}
class Dog extends Animal {}

void main() {
  Animal pet = Dog();
  
  print(pet is Dog);     // true
  print(pet is Animal);  // true (Dog הוא Animal)
  print(pet is String);  // false
}

כשמשתמשים ב־is בתוך משפט if, Dart מקדמת אוטומטית את הטיפוס, ומאפשרת לגשת לחברי תת־המחלקה בלי המרה מפורשת:

void handleAnimal(Animal animal) {
  if (animal is Dog) {
    // Dart יודע שכאן animal הוא Dog
    animal.bark();  // אפשר לקרוא למתודות ייחודיות ל-Dog
  }
}

האופרטור as ממיר אובייקט באופן מפורש לטיפוס מסוים. השתמש בו כשאתה בטוח מהו הטיפוס:

Animal pet = Dog();
Dog myDog = pet as Dog;  // בצע המרת טיפוס ל-Dog
myDog.bark();

היזהרו בשימוש ב־as — אם ההמרה נכשלת, נזרקת חריגה. לכן שילוב של is עם קידום טיפוסים בטוח לעיתים קרובות יותר משימוש ישיר ב־as. אפשר גם להשתמש ב־is! כדי לבדוק אם אובייקט אינו מטיפוס מסוים.

challenge icon

אתגר

קל

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

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

  • shapes.dart: הגדר כאן את היררכיית הצורות:
    • מחלקת Shape עם מאפיין String name ובנאי. כלול בה מתודה describe() שמדפיסה [name] is a shape
    • מחלקת Circle שיורשת מ-Shape וכוללת מאפיין נוסף double radius. הוסף מתודה getCircleInfo() שמדפיסה Circle with radius: [radius]
    • מחלקת Rectangle שיורשת מ-Shape וכוללת את המאפיינים הנוספים double width ו-double height. הוסף מתודה getRectangleInfo() שמדפיסה Rectangle: [width] x [height]
  • main.dart: ייבא את קובץ הצורות שלך וצור פונקציה processShape(Shape shape) ש:
    • קוראת תחילה ל-describe() של הצורה
    • משתמשת ב-is כדי לבדוק אם הצורה היא Circle — אם כן, השתמש בקידום טיפוסים כדי לקרוא ל-getCircleInfo()
    • משתמשת ב-is כדי לבדוק אם הצורה היא Rectangle — אם כן, השתמש באופרטור as כדי להמיר את הטיפוס שלה וקרא ל-getRectangleInfo()
    • משתמשת ב-is! כדי לבדוק אם הצורה אינה Circle וגם אינה Rectangle — אם כן, הדפס Unknown shape type
    לאחר מכן, בפונקציה main() שלך:
    • צור Circle בשם 'Round' עם רדיוס 5.0 והעבר אותו אל processShape()
    • הדפס שורה ריקה
    • צור Rectangle בשם 'Box' עם רוחב 4.0 וגובה 3.0 והעבר אותו אל processShape()
    • הדפס שורה ריקה
    • צור Shape בסיסית בשם 'Mystery' והעבר אותה אל processShape()

האתגר הזה מדגים את שתי הגישות: שימוש ב-is עם קידום טיפוסים אוטומטי עבור Circle, ושימוש ב-as להמרת טיפוס מפורשת עבור Rectangle. תראה גם איך is! עוזר לזהות צורות שאינן תואמות לאף תת-טיפוס ספציפי.

פלט צפוי:

Round is a shape
Circle with radius: 5.0

Box is a shape
Rectangle: 4.0 x 3.0

Mystery is a shape
Unknown shape type

נסו בעצמכם

import 'shapes.dart';

// TODO: צרו פונקציה processShape(Shape shape) אשר:
// 1. תחילה קוראת ל־describe() על הצורה
// 2. משתמשת ב־'is' כדי לבדוק אם הצורה היא Circle - אם כן, השתמשו בקידום טיפוסים כדי לקרוא ל־getCircleInfo()
// 3. משתמשת ב־'is' כדי לבדוק אם הצורה היא Rectangle - אם כן, השתמשו באופרטור 'as' להמרת טיפוס ולקריאה ל־getRectangleInfo()
// 4. משתמשת ב־'is!' כדי לבדוק אם הצורה אינה Circle ואינה Rectangle - אם כן, הדפיסו "Unknown shape type"

void main() {
  // TODO: צרו Circle בשם 'Round' עם רדיוס 5.0 והעבירו אותו ל־processShape()
  
  // TODO: הדפיסו שורה ריקה
  
  // TODO: צרו Rectangle בשם 'Box' עם רוחב 4.0 וגובה 3.0 והעבירו אותו ל־processShape()
  
  // TODO: הדפיסו שורה ריקה
  
  // TODO: צרו Shape בסיסי בשם 'Mystery' והעבירו אותו ל־processShape()
}
quiz iconבחנו את עצמכם

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

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

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