
is ו-as, שעוזרים לעבוד עם רפרנס בסיס כשרוצים להגיע למידע שקיים רק בטיפוס הנגזר.Shape רואים רק את החברים של Shape, ולא את הרדיוס של עיגול.Circle בעזרת סוגריים, אבל אם האובייקט בפועל הוא מלבן, התוכנית קורסת עם InvalidCastException.is - בדיקהobj is Circle מחזיר true אם האובייקט הוא עיגול או נגזרת שלו, ו-false אחרת.as - המרהarray[i] as Circle מחזיר את האובייקט בטיפוס עיגול, או null אם ההמרה לא הצליחה.null לפני השימוש בו.as לכל פריט.is מחזיר ערך בוליאני, ואילו as מחזיר רפרנס או null. בדיקה עם is לפני קאסטינג מונעת שגיאות ריצה, ו-as נותן קוד קריא יותר. כעת אפשר לגשת למידע של הטיפוס הנגזר בלי לקרוס, גם כשמערך אחד מחזיק צורות שונות.הטקסט המלא של הדקות הראשונות בהרצאה «אופרטורים operators is and as» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו עוברים לראות שני אופרטורים חדשים באובג'קט אוריינטד בדוטנט שמאוד מאוד עוזרים לנו כאשר אנחנו עובדים עם עיקרון הפולימורפיזם אז קודם כל בואו ניקח איזושהי דוגמה שיכולה להתרחש במציאות מה שאני אעשה אני אמחוק את כל מה שכתבנו כאן במיין ואני אכתוב משהו דומה
בואו נמחוק גם את הפונקציה הזאת ומה שאני רוצה לעשות אני רוצה לפתוח מערך שיחזיק לי כל מיני צורות ריבועים, מלבנים, עיגולים, כרגע יש לנו רק עיגולים ומלבנים אז אני רוצה לפתוח פשוט איזשהו מערך כזה, כמובן שראינו שבגלל העיקרון
שרפרנס בסיס יכול להצביע על אובייקט נגזרת אין לנו שום בעיה לקחת מערך שהוא מטיפוס שייפ, בו כל תא יהיה רפרנס של שייפ ולכן יוכל להצביע על אובייקטים של צורות שונות.
אז בואו ניקח מערך שייפס, נקרא לזה הרייפ, וניצור שייפ בגודל 4. ומה שאני רוצה להכניס אליו, אני רוצה להכניס למערך הזה שני עיגולים ושני מלבנים.
אז בואו נלך למיקום 0 ונכניס אליו New Circle, נלך למיקום 1 ונכניס New Rectangle, נפתם זורק פה כל מיני ערכים, ונלך למיקום 2 ו-3, יש לנו עוד Circle ועוד Rectangle.
כעת אני רוצה לבנות איזושהי פונקציה שתקבל את כל המערך הזה ותציג רק את הכתרים של העיגולים. יותר זה דיאמטר ובואו נניח שהיא מקבלת את כל המערך והפונקציה הזאת יודעת כמובן שאם היא קיבלה מערך של שייפס זאת אומרת שמה שיכול להיות בתוך המערך הזה זה בעצם אובייקטים שהם או שייפס או נגזרות של שייפס האמת שאפילו אפשר להוסיף כאן לצורך הדוגמה גם שייפס בכדי
שנבין את זה יותר טוב ניקח את זה בתור 3 3 יש לנו כאן עוד שייפס תכף נסדר את האינדקסים 0, 1, 2, 3, 4, 5 זה הולך להיות 4, זה הולך להיות 5 וזה הולך להיות 6 בכדי שיהיה פה איזושהי אחידות למרות שהמספרים כמובן לא משנים יש לנו עכשיו מערך שהוא מכיל גם עיגולים, גם הלבנים, גם צורה כללית כלשהי
אפילו 2 מכל אחד ואנחנו עכשיו רוצים ללכת ולשלוח את כל המערך הזה לפונקציה show diameters קודם כל בואו נריץ קומפילציה ונראה אם הכל עובר בהצלחה בבקשה אם אני ריבילג נראה פה למטה מה הוא כותב לנו כותב לנו ריבילג אול סקסידד זאת אומרת אין לנו שום בעיה לקחת מערך כזה להכניס לתוכו
את כל הצורות שיכולות להיות שנגזרות מתוך שייפ כולל אובייקטים של שייפ לשלוח את המערך לפונקציה שמקבלת מערך ועכשיו אנחנו רוצים לרוץ בהלולאה רגילה על כל המערך ואנחנו רוצים לבצע פעולה מסוימת עם פריטים מסוימים במערך זאת אומרת אני לא רוצה לבצע פעולה כללית של כל הפריטים אלא רק חלק
מהם. עכשיו רגע אם הייתי רוצה לעשות פעולה כללית על כל הפריטים מה זאת אומרת בוא נניח שהייתי רוצה להציג את כל הפריטים כל מה שהייתי צריך לעשות זה arr.print ואת זה ראינו arr האמת במיקום i ליתר דיוק .print את זה ראינו כשלמדנו על פולימורפיזם וראינו שפונקציית הפרינט כתבנו אותה בצורה כזאת שהיא תהיה פונקציה וירטואלית.
בואו נסתכל רגע על פונקציית פרינט בשייפ ונראה שכשכתבנו אותה רשמנו וירטואל וכאשר דרסנו אותה במחלקות נגזרות רשמנו אוברייד, אוברייד באנגלית זה דריסה והסיבה שכתבנו את הפונקציה בצורה כזאת זה אך ורק בכדי שאם קיים לנו בתוכנית איזשהו רפרנס מטיפוס
בסיס כמו שיש לנו כאן במקרה הזה יש לנו רפרנס בתוך המערך שמצביע על איזשהו אובייקט מאותו הטיפוס או מטיפוס נגזר ואנחנו קוראים לו פונקציה פרינט אנחנו רוצים שהפונקציה שתתבצע תהיה זאת ששייכת למחלקה של האובייקט האמיתי שקיים בזה עיקרון
ולא למחלקה של הרפרנס שלו אם אנחנו עכשיו, אפילו בואו נשנה את הפונקציה הזאת show shapes אם אנחנו נריץ את זה אנחנו נקבל את ההדפסות המדויקות של כל הצורות בואו נסתכל על זה רגע נטפל רגע בבעיה המערך הזה כבר לא אמור להיות בגודל 4, הוא
אמור להיות בגודל 6 נריץ, ונקבל את כל ההדפסות הנכונות שיש כלומר, אם האובייקט שלנו הוא אובייקט שייפ אנחנו רואים שאנחנו מקבלים אך ורק שייפ אנחנו יכולים לראות את זה פה x שווה 22, y שווה 22 אם האובייקט שלנו הוא אובייקט סרקל, אנחנו מקבלים את כל הסרקל אנחנו יכולים לראות את זה פה בעצם, איפה שהרדיוס
22, 22 זה בעצם מלבן, 33 ראינו שזה שייפ, אוקיי, ואנחנו רואים את זה. אפילו אפשר, בשביל שזה יהיה יותר... לא, זה בסדר.
Anyway, יש לנו כאן את הפונקציה הזאת, ואנחנו ראינו שאנחנו מבצעים פעולה כללית, כמו הדפסה, אין לנו שום בעיה לבצע את ההדפסה הנכונה. עכשיו אנחנו רוצים לבצע פעולה אחרת.
אנחנו רוצים להתחיל לבצע את הפעולה הקודמת שדיברנו עליה, show diameters. טוב, קודם כל, בואו נסתכל אם קיים לי פה איזשהו רדיוס הרי מה אני רוצה לעשות?
אנחנו מחפשים להדפיס רק את הכתרים של העיגולים זאת אומרת אנחנו רוצים לבצע פעולה לא על כל האובייקטים שקיימים אלא רק על האובייקטים מסוג מסוים והדבר הזה קורה לכם הרבה בגלל שיש לכם את היכולת עכשיו לקחת איזשהו מערך שהוא מטיפוס בסיס כלשהו ולהכניס אליו אובייקטים מכל מיני צורות ויותר
נכון מכל מיני טיפוסים שונים ואתם רוצים לרוץ על כל המערך הזה, אם אתם רוצים לבצע פעולה כללית על ידי פונקציה וירטואלית שקיימת בכל הטיפוסים השונים, אין לכם שום בעיה פשוט לקרוא לה.
אבל אם אתם רוצים לעשות פעולה שקשורה רק לאובייקטים מסוימים במערך, אז כאן אנחנו צריכים להבין איך להתמודד עם הנקודה הזאת. עכשיו תחשבו שזה יכול לקרות לכם הרבה, יש לכם כל מיני תפקידים שונים בתוכנה, לקוחות, ספקים, מזכירות, מנהלים, אנשי שיווק, כל מיני תפקידים שונים במערך אחד.
אתם רוצים לרוץ על כל המערך ורק עבור הלקוחות להדפיס את כרטיסי האשראי, או רק עבור הספקים להסתכל על סוג הסחורה. יש לכם הרבה צורות, ואתם רוצים לרוץ על כל הצורות שלכם שקיימות במערך אחד ולהציג רק את הכתרים כמו שיש לנו כאן.
יש לכם המון כלי נגינה במערך אחד, ואתם רוצים לרוץ על כל הכלי נגינה שהמערך כמובן הטיפוס שלו זה הכלי נגינה הבסיסי, לרוץ על כל האובייקטים, ורק אם יש לכם פסנתר או בייק פסנתר אתם רוצים להשמיע את הקול שלו, אוקיי?
יש לכם כל מיני מכוניות, סוגים של מכוניות במערך אחד ורק אם אתם משאית אתם רוצים להציג את המשקל הכללי שלה. זאת אומרת כל פעם שיש לכם מערך שיכול להכיל המון טיפוסים שונים, כמובן הוא יהיה מהטיפוס של הבייס, של הבסיס, אז הרבה פעמים קורה שאתם רוצים לבצע פעולות רק על חלק מהפרטים שנמצאים במערך.
ועכשיו אנחנו מבצעים את הפרטים האלה. קודם כל אנחנו נתקלים פה באיזושהי בעיה שאנחנו בכלל לא רואים רדיוס ולא רואים רוחב ולא רואים גובה ולא רואים כל דבר שהוא בכלל לא שייפ.
למה אנחנו רואים פרינט? כי פרינט נמצאת בשייפ אז אנחנו רואים אותה כי הרפרנס שלנו הוא שייפ. הרי אם נחשוב על זה נראה שכאשר אנחנו לוחצים נקודה נפתח לנו חלונית שנקראת IntelliSense ומי שמציג לנו את החלונית הזאת בעצם תוכנת ויז'ואל סטודיו ויז'ואל סטודיו כשהיא מציגה לנו את החלונית
היא חייבת להסתכל ולראות מה סוג כל פריט במערך והיא אומרת אני רואה שזה שייפ זאת אומרת מה שאני אציג לכם זה חלונית של שייפ אתם יכולים להגיד רגע אבל ברור שעוד מעט הולך להיכנס פה סרקל אבל ויז'ואל סטודיו לא מריצה את התוכנית בשביל לראות מה באמת האובייקט שקיים שם בשביל לפתוח לכם intelligence וגם אם היא
תעשה את זה איזה אובייקט באמת קיים ב-rai פה אנחנו רואים שקיים סרקל אבל פה בכלל ריקטנגל אז למה שהיא תציג לנו רדיוס ולכן ויז'ל סטודיו אומרת אני מבחינתי הולכת על נתונים יציבים נתון יציב זה נתון שאני יודעת בוודאות שהוא נכון אני לא יודעת מה יקרה בהמשך ומה שאני יודעת בוודאות שזה נכון זה שכל פריט במערך הזה הסוג שלו זה שייפ גם אם האובייקט בסופו
של דבר יהיה סרקל עדיין אם אני אציג את מה שיש לשייפ זה בוודאות יהיה גם לסרקל כי גם לסרקל יש x וy כי הוא יורש את שייפ אז אפשר להגיד שזה בטוח להציג את מה שיש בשייפ ואי אפשר ללכת ולהגיד טוב הולך להיות לנו כאן רדיוס קודם כל זה לא מדויק ולא נכון כי לפעמים
אין רדיוס בואו נניח שאנחנו רוצים עכשיו להציג את הכתרים שבו נפתח כאן איזשהו משתנה נקרא לו דיאמטר קוטר נלך ל-ra על i וניגש לרדיוס אפילו שאין רדיוס כפול רדיוס זה הקוטר עכשיו אנחנו כמובן רואים שגיאת קומפילציה כי המערכת אומרת לנו מה בדיוק אתם רוצים, אין
לי בכלל רדיוס ב-shape אז בואו נסתכל איך אנחנו פותרים את הבעיה הזאת דבר ראשון, מה שאנחנו צריכים לעשות בקאסטינג קאסטינג, אנחנו ראינו שאנחנו עושים על ידי סוגריים עגולות לפני האייטם שאנחנו רוצים לבצע קאסטינג עבורו והקאסטינג שאנחנו רוצים לבצע זה קאסטינג ל-circle
זאת אומרת, אם עכשיו אנחנו נבצע קאסטינג לדבר הזה אנחנו נראה שאנחנו רוצים בעצם לקחת את ה-ray-eye שהוא טיפוס שייפ כללי ולהפוך אותו לסרקל קודם כל אנחנו רואים שזה לא פתר את הבעיה והסיבה שזה לא פתר את הבעיה היא שיש פה שני אופרטורים שמקיפים את הרפרנס שייפ
אחד מהם זה הסרקל casting הסרקל והשני זה נקודה ומי שיותר חזק זה הסרקל לכן מה שעשינו פה זה ליתר דיוק הנקודה יותר חזקה מה שקרה כאן זה שקודם כל הרפרנס ביצע את הנקודה, הגיע למה שיש ב-shape ורק אחר כך הקאסטינג נכנס לפעולה.
אם אנחנו רוצים שהדבר הזה יעבוד אנחנו צריכים עוד סוגריים שעוטפים את כל זה. ועכשיו מה שקרה כאן וסוגריים ידוע שהם קודמים לכל דבר אחר ולכן קודם כל לפי הסוגריים האלה יתבצע קאסטינג מ-reference-shape ל-reference-circle אם אנחנו ב-reference circle ואנחנו לוחצים
נקודה כמובן שיש לנו רדיוס אנחנו רואים אותו פה בואו נעשה את זה גם כאן נגדיר פה סוגריים שעוטפים את זה כעת אנחנו יכולים ללכת ולהציג את הדיאמטר קודם כל אם אנחנו נבצע קומפילציה אנחנו נראה שהיא עוברת בהצלחה אז בעיית הקומפילציה נפתרה תוכנית יכולה לרוץ השאלה עם הקוד שכתבנו נכון
האם אנחנו יכולים לבצע קאסטינג לכל אובייקט שקיים במערך. בואו נסתכל ונראה שרגע האובייקט הראשון זה סרקל אבל האובייקט השני זה בכלל ריקטנגל. האם אני יכול לבצע קאסטינג מריקטנגל לסרקל או משייפ לסרקל?
אז התשובה היא אני לא יכול לבצע קאסטינג מכל דבר לכל דבר ואני יכול לבצע קאסטינג לסרקל רק אם האובייקט שאכן קיים כאן הזאת הוא או סרקל או נגזרת של סרקל בשני המקרים האלה אני יכול לבצע קאסטינג לסרקל כלומר או שהאובייקט הוא באמת סרקל או שהוא יורש מסרקל מה שאין לנו כאן כרגע ריקטנגל הוא לא סרקל ולא יורש מסרקל שייפ
זה לא סרקל וגם לא יורש מסרקל ולכן אנחנו לא יכולים לבצע את זה אז בואו נריץ ונראה שהתוכנית קורסת ומה שהיא נותנת לנו רגע בואו נריץ רק את הפונקציה מה שהיא הולכת לתת לנו זה קריסה מאוד מעניינת מה שהיא הולכת לתת לנו זה קריסה שנקראת, נריץ את זה עם F5,
Invalid Cast Exception, תכף נראה את זה. כלומר, השגיאה שמופיעה כאן נקראת Invalid Cast Exception, זאת הודעת השגיאה שאנחנו רואים, והתיאור שלה זה Unable to Cast Object of Type Rectangle to Type Circle.
כלומר, הסוג האמיתי שהיה קיים שם זה רקטנגל, אנחנו ניסינו להפוך אותו לסרקל, והמערכת כמובן לא יכולה לעשות את זה, שקטנגל הוא לא סרקל והוא לא יורש מסרקל עכשיו זה לא שהקוד שכתבנו פה הוא לא נכון כי אנחנו כן רוצים להגיע לרדיוסים והיינו חייבים לבצע קאסטינג אבל פשוט הקוד הזה חסר בדיקה שאכן מה שקיים כאן זה טיפוס סרקל זאת אומרת
שנייה לפני שאנחנו באמת באים ואומרים בוא תמיר לנו את הרפרנס הזה לאובייקט סרקל אנחנו צריכים לבדוק האם באמת קיים פה אובייקט סרקל כי יכול להיות שקיים פה אובייקט שהוא לא סרקל והבדיקה מתבצעת עם האופרטור הראשון שאנחנו הולכים להכיר והאופרטור הראשון הזה
נקרא אופרטור איז. איז אומר דבר כזה מצד שמאל שלי תנו לי איזשהו אובייקט מצד ימין שלי תנו לי איזשהו טייפ ואני אבדוק האם האובייקט שנתתם לי פה מצד שמאל הוא מסוג הטייפ שנתתם לי מצד ימין או נגזרת שלו לא חייב להיות הסוג המדויק יכול להיות גם שהוא יורש אותו אם כן
אם אני מחזיר לכם true, זאת אומרת שאיזה אופרטור בוליאני מחזיר true או false? אם לא, מחזיר לכם false. זאת אומרת, כל מה שאנחנו צריכים לעשות זה לבדוק האם ARRI, שזה איזשהו אובייקט שקיים כרגע, הוא מטיפוס circle.
רק אם כן, אנחנו יודעים שבוודאות מותר לנו ללכת ולבצע קאסטינג ל-circle. אוקיי, בואו נבדוק עכשיו. ואנחנו רואים שיש לנו כעת שני דיאמטרס, אנחנו רואים אחד כאן 121 ואנחנו רואים אחד כאן 1936. בואו נסדר טיפה את ההדפסה ונציג כאן איזושהי ירידת שורה ואז נראה את זה קצת