בפוסטים קודמים נגעתי בירושה בסוויפט. בפוסט הזה, אני הולך לצלול יותר לעומק ולתת לך תמונה מלאה יותר של איך תורשה עובדת ב-Swift, וכיצד אתה יכול להשתמש בה כדי ליצור אפליקציות שקל להרחיב כאשר אתה צריך להוסיף פונקציונליות חדשה. על הדרך גם תלמדו על המושג החשוב של פולימורפיזם ותלמדו איך להשתמש במגרשי המשחקים החדשים של Xcode!
ירושה מאפשרת לך ליצור מחלקות חדשות המבוססות על מחלקות אחרות. לדוגמה, איור 1 מראה א מחשבון מדעי כיתה מסווגת מ-a מַחשְׁבוֹן מעמד. במערכת היחסים הזו, מַחשְׁבוֹן האם ה מעמד על ו מחשבון מדעי האם ה תת מחלקה .
![]() |
איור 1 - מחשבון מדעי הוא תת-מחלקה של מַחשְׁבוֹן . |
ציון מחלקת-על הוא אופציונלי, אך ניתן לציין מחלקת-על בהצהרת המחלקה:
כיתה ללא כיתה על ידועה בשם a מעמד בסיס .
היופי בירושה הוא שלא צריך ליצור כל מחלקה מאפס. אתה יכול ליצור תת מחלקה ממחלקה קיימת, לרשת את כל המאפיינים והשיטות שלה ולהרחיב אותה כך שתתאים לצרכים שלך.
בדוגמה זו, ה מחשבון מדעי יורש את כל הפונקציונליות שלו מַחשְׁבוֹן מעמד על, כולל לְהוֹסִיף , להחסיר , לְהַכפִּיל , לחלק , ו ברור שיטות. אתה לא צריך לשכתב את השיטות האלה עבור מחשבון מדעי מעמד. הם פשוט עוברים בירושה. ה, אתה יכול להוסיף שיטות ל- מחשבון מדעי כיתה - כגון עֵץ , לְלֹא , חַסַת עָלִים , ו כך - שמרחיבים את הפונקציונליות שלו ומתמחים אותו.
שיטות עוקפות
לפעמים, ייתכן שתצטרך לעקוף שיטה או נכס שעברו בירושה ממעמד-על. כדי לעקוף חבר שעבר בירושה, הכריז על יישום חדש של אותו חבר בקובץ מחלקה וסמן אותו עם לעקוף מילת מפתח.
עקיפה של חבר שעבר בירושה מאפשרת לך:
- לְהַאֲרִיך החבר על ידי ביצוע משהו נוסף בתת המחלקה
- ביטול חבר מעמד העל על ידי עשיית משהו שונה לחלוטין בתת הכיתה.
כדי לגשת לחבר מחלקה-על כגון מאפיין או שיטה, השתמש ב- סוּפֶּר. קידומת ואחריה שם החבר שאתה עוקף.
בואו נבדוק דוגמה של ירושה. על מנת לעקוב, הורד את הפרויקט לדוגמה מאת הקישור הזה .
- פתח את ה AdvancedSwiftDemo פרויקט שהורדת זה עתה.
- ב-Project Navigator, התעמק ב- AdvancedSwiftDemo צומת לראות את מַחשְׁבוֹן ו מחשבון מדעי שיעורים.
- בחר את Calculator.swift קובץ הקוד ב-Project Navigator ושימו לב ל- ברור שיטה ב מַחשְׁבוֹן מחלקה על:
- בחר את ScientificCalculator.swift קובץ כדי לראות שזה תת-מחלקה של מַחשְׁבוֹן מעמד:
- שימו לב שיש גם א ברור שיטה שעוברת בירושה מה מַחשְׁבוֹן מעמד:
שיטה זו עוקפת את ברור שיטה ב מַחשְׁבוֹן מעמד על. זכור שאתה עוקף שיטה שעברה בירושה על ידי הוספת מתודה עם אותה חתימה בתת המחלקה וסימון שלה עם לעקוף מילת מפתח, כפי שמוצג לעיל.
בשורת הקוד הראשונה יש קריאה ל סופר.ברור , אשר מכנה את ברור שיטה ב מַחשְׁבוֹן מעמד על. זה מאוד נפוץ. בעת עקיפת שיטה, לעתים קרובות אתה מבצע קריאה לשיטת superclass בנוסף לקוד המותאם אישית שהוספת. זה מאפשר לך להרחיב את הפונקציונליות הקיימת של השיטה מכיוון שאתה עדיין מפעיל את השיטה ב- superclass, ואתה עושה משהו נוסף ב-subclass.
כאשר השיטה מבוצעת בתת המחלקה:
- ראשית, מבוצעת קריאה לשיטה קלה של Calculator superclass שמנקה את סך הכל תכונה.
- הביצוע עובר ל- מחשבון מדעי תת מחלקה ברור השיטה וה- זיכרון הרכוש פונה.
כדי לראות את זה בזמן ריצה:
- הרחב את ה AdvancedSwiftDemoTests צומת ב-Project Navigator ולאחר מכן בחר את AdvancedSwiftDemoTests.swift קובץ קוד.
- הוסף את שיטת הבדיקה הבאה לפני הסד המתולתל הסוגר של הכיתה:
למרות שאינו מבחן יחידה אמיתי, קוד זה יוצר מופע של מחשבון מדעי class ולאחר מכן קורא לאובייקט ברור שיטה כדי שנוכל לראות איך זה עובד בזמן ריצה.
- לאחר מכן, הגדר נקודת שבירה בשורת הקוד הראשונה בשיטת הבדיקה החדשה על ידי לחיצה במרזב משמאל ( איור 2 ).
![]() |
איור 2 - הגדר נקודת שבירה. |
- ללחוץ Command+B לבנות את הפרויקט.
- בסרגל הכלים של Navigator בצד שמאל של חלון Xcode, לחץ על הלחצן החמישי משמאל כדי לבחור ב- Test Navigator ולאחר מכן לחץ על כפתור ההפעלה מימין ל- testScientificCalculatorCrear שיטת בדיקה ( איור 3 ). הערה: אם אינך רואה את הבדיקה הזו, פשוט לחץ על כפתור ההפעלה מימין ל- AdvancedSwiftDemo תיקיית בדיקות.
![]() |
איור 3 - הפעל את testScientificCalculatorCrear מִבְחָן. |
- זה גורם לך להגיע לנקודת השבירה בשיטת הבדיקה ( איור 4 ). כפי שאתה יכול לראות, הקוד שיוצר מופע של מחשבון מדעי הכיתה ממתינה לביצוע.
![]() |
איור 4 - נקודת השבירה נפגעת. |
- בסרגל הכלים Debug בתחתית חלון Xcode, לחץ על להכנס לתוך לחצן לביצוע שורת קוד זו. זה מתחיל את תהליך יצירת האובייקט ולוקח אותך לאתחול של ScientificCalculator's זיכרון תכונה ( איור 5 ).
![]() |
איור 5 - אתחול ה זיכרון תכונה |
- הקש על להכנס לתוך כפתור שוב. זה לוקח אותך לאתחול של מַחשְׁבוֹן של הכיתה סך הכל תכונה ( איור 6 ).
![]() |
איור 6 - אתחול של סך הכל תכונה |
- לחץ על צא החוצה כפתור ותוחזרו לשורה הראשונה של שיטת הבדיקה. הקש על לדרוך מעל כפתור והאתחול מחשבון מדעי אובייקט שמוחזר בקריאה מחשבון מדעי() מאוחסן ב calc משתנה ( איור 7 ).
![]() |
איור 7 - ה מחשבון מדעי נוצר אובייקט. |
- עם אתחול מלא מחשבון מדעי אובייקט, אתה מוכן להפעיל אותו ברור שיטה. לחץ על להכנס לתוך כפתור ותועבר לשורת הקוד הראשונה ב- מחשבון מדעי של חפץ ברור שיטה ( הספרה 8 ).
![]() |
איור 8 - הפעלת ה מחשבון מדעי של חפץ ברור שיטה. |
- הקוד שקורא למעמד העל ברור השיטה ממתינה לביצוע. לחץ על להכנס לתוך הלחצן והביצוע מועברים למחשבון ברור שיטה, שמתכוננת לאחסון 0.0 ב סך הכל תכונה ( איור 9 ).
![]() |
איור 9 - הפעלת המחשבון ברור שיטה |
- לחץ על צא החוצה כפתור ואתה תוחזר ל- מחשבון מדעי של חפץ ברור שיטה, שמחכה לביצוע שורת הקוד המאחסנת 0.0 בתוך ה זיכרון תכונה ( איור 10 ).
![]() |
איור 10 - מתכונן לנקות את זיכרון תכונה. |
- נְקִישָׁה צא החוצה ואז לדרוך מעל , והביצוע יעבור לסוף שיטת הבדיקה ( איור 11 ).
![]() |
איור 11 - חזרה ב- מִבְחָן שיטה |
- לחץ על לְהַמשִׁיך לחצן בסרגל הכלים Debug כדי לסיים את הפעלת הבדיקה.
כמה הערות נוספות על עקיפה - כאשר אתה מחליף שיטה, אתה יכול לבחור להוסיף קוד מותאם אישית לפני הקריאה ל סוּפֶּר , או לאחר הקריאה ל סוּפֶּר (או שניהם). לדוגמה:
כמו כן, אם תבטל את הקריאה לשיטת superclass, אתה לחלוטין לעקוף את הקוד ב- superclass, כי הקוד הזה לעולם לא מבוצע. זה נפוץ יותר ל לְהַאֲרִיך שיטה על ידי הכללת הקריאה אל סוּפֶּר .
עוקף מאפיינים
למרות שזה נפוץ יותר לעקוף שיטות, ייתכנו מקרים שבהם תרצה לעקוף מאפיינים של מחלקת-על כדי להוסיף פונקציונליות חדשה לתת-המחלקה. בואו נסתכל על הוראות שלב אחר שלב כדי לראות איך זה נעשה.
- התחל ביצירת מגרש משחקים חדש. בחר קובץ > חדש > מגרש משחקים... מהתפריט של Xcode.
- בתיבת הדו-שיח צור מגרש משחקים, שנה את השם ל InheritancePlayground . ודא ש פּלַטפוֹרמָה נקבע ל iOS , ולאחר מכן לחץ הַבָּא .
- בתיבת הדו-שיח שמירה, בחר תיקיה לשמירת מגרש המשחקים ולאחר מכן לחץ לִיצוֹר
- מחק את הקוד לדוגמה 'שלום מגרש משחקים' בחלק העליון של מגרש המשחקים.
- הוסף את הקוד הבא למגרש המשחקים שמצהיר על א ישות מטופלת כיתה עם שלושה מאפיינים:
זֶה ישות מטופלת הכיתה מכילה מספר תעודת זהות, שהוא מידע רגיש. הוסף את הקוד הבא למגרש המשחקים מתחת להצהרת הכיתה:
קוד זה יוצר מופע של ישות מטופלת מחלקה ולאחר מכן ניגשת אליה SSN תכונה. זה מציג את המידע המופיע ב איור 12 בסרגל הצד תוצאות.
![]() |
איור 12 - ה ישות מטופלת מספר ביטוח לאומי |
ברוב המקרים, אנשים הצופים במידע של מטופל זה לא אמורים להיות מסוגלים לראות את מספר תעודת הזהות המלא שלהם. אז בואו ניצור תת מחלקה מאובטחת יותר.
- הוסף את הקוד הבא למגרש המשחקים מתחת לקוד שהוספת זה עתה:
PatientSecureEntity הוא תת-מחלקה של ישות מטופלת ומעקף את העובר בירושה SSN תכונה. כמה דברים שחשוב לשים לב לקוד זה:
- כדי לעקוף נכס, עליך להשתמש ב- לעקוף מילת מפתח ולאחר מכן עליך לציין את השם והסוג של הנכס. זה עוזר למהדר לאמת שאתה עוקף את המאפיין הנכון.
- בתוך ה ישות מטופלת מעמד על, ה SSN רכוש הוא רכוש מאוחסן. ב-Swift, אתה יכול לעקוף כל נכס, בין אם הוא מאוחסן או מחושב.
- הקוד בשיטת get מופעל בכל פעם ש- SSN הנכס נגיש. קוד זה מחזיר סדרה של כוכביות ומקפים ואחריהם ארבע הספרות האחרונות של מספר תעודת זהות.
- בתוך ה לקבל השיטה, תוכל לגשת לערך המאפיין באמצעות התחביר super.propertyName .
- אם מחלקת העל מכריזה על מאפיין כקריאה-כתיבה, עליך לספק את שני ה- לקבל ו מַעֲרֶכֶת שיטות בתת המחלקה. עם זאת, אם מחלקת העל מצהירה על מאפיין לקריאה בלבד, אתה יכול לגרום לו לקרוא-כתיבה בתת המחלקה.
- אם אתה מצהיר על א מַעֲרֶכֶת מתודה בתת-מחלקה, עליך להכריז גם על a לקבל שיטה. אם אתה לא רוצה לעשות שום דבר ב לקבל שיטה, פשוט לחזור super.propertyName .
- הקוד ב- מַעֲרֶכֶת השיטה נפטרת כאשר ערך מאוחסן בנכס. כפי שמראה הקוד לדוגמה, אתה יכול לגשת לערך הנשמר בנכס באמצעות ה- ערך חדש טַעֲנָה.
- כעת הוסף את הקוד הבא מתחת ל- PatientSecureEntity כדי לבדוק את עומס הנכס:
קוד זה יוצר מופע של PatientSecureEntity ואז ניגש אליו SSN תכונה. זה מציג את המידע ב איור 15 בסרגל הצד התוצאות.
![]() |
איור 13 - ה PatientSecureEntity SSN |
למרות שהשורה הראשונה בסרגל הצד של התוצאות מציגה את המצב הפנימי של SSN רכוש, כל מי שמתייחס ל SSN מאפיין בקוד יראה רק את ארבע הספרות האחרונות כפי שמוצג בשורה השנייה.
- אתה יכול ליצור ביעילות מאפיין לקריאה בלבד על ידי אי הוספת קוד כלשהו ל- מַעֲרֶכֶת שיטה. מכיוון שזו הגרסה המאובטחת של הישות, ייתכן שלא תרצו לאפשר שינוי במספר ת.ז. של המטופל. בואו נוודא שלא ניתן לשנותו. הגיבו לקוד ב- מַעֲרֶכֶת שיטה כפי שמוצג כאן:
- עכשיו בואו נראה מה קורה אם ננסה להקצות ערך ל- PatientSecureEntity של חפץ SSN תכונה. הוסף את הקוד הבא מתחת לקוד שהוספת בשלב הקודם:
עיין בסרגל הצד של התוצאות ותראה את הערך של SSN הנכס לא השתנה!
מניעת דריסה
לפעמים, ייתכן שתרצה למנוע ממישהו לעקוף חבר בכיתה או מכיתה שלמה. עשה זאת על ידי שימוש ב- סופי מַתקֵן.
לדוגמה, אם אתה לא רוצה שמישהו יעקוף את SSN רכוש ה PatientSecureEntity בכיתה, אתה יכול לסמן אותו עם סופי שינוי כזה:
אתה יכול למנוע את ביטול הכיתה כולה על ידי סימון כ סופי :
והנה שיטה מסומנת כסופית:
רב צורתיות
פולימורפיזם הוא אחד מעקרונות הליבה של תכנות מונחה עצמים, ואתה באמת צריך להבין אותו היטב כדי לכתוב את הקוד היעיל ביותר.
עד כה, בכל פעם שהצהרת על משתנה מסוג מסוים, תמיד אחסנת אובייקט מאותו סוג בדיוק במשתנה. לדוגמה, הקוד הבא מצהיר על משתנה מסוג UITextField , ולאחר מכן יוצר מופע של UITextField ומאחסן אותו ב שדה טקסט מִשְׁתַנֶה:
אין כאן הפתעות. עם זאת, ב-Swift, כאשר אתה מצהיר על משתנה מסוג מסוים, הוא יכול גם להכיל הפניה לכל תת מחלקה מסוג זה. לדוגמה, קח את היררכיית הכיתה המוצגת ב איור 14 , אשר מציג UITextField , UIButton , ו UISlider , רק כמה מתתי המחלקות של ה- UIControl מעמד.
![]() |
איור 15 - כאשר אתה מכריז על משתנה מסוג מסוים, הוא יכול להכיל הפניה לכל תת מחלקה מסוג זה. |
המילה 'פולימורפיזם' פירושה 'צורות רבות', ובדוגמה זו אתה יכול לראות את UIControl המחלקה יכולה ללבוש צורות רבות ושונות - שדה טקסט, כפתור או מתג.
בהינתן היררכיה זו, אתה יכול להכריז על משתנה מסוג UIControl ולאחר מכן אחסן הפניה ל- UITextField , UIButton אוֹ UISwitch אובייקט במשתנה זה:
פולימורפיזם מאפשר לך לכתוב קוד גנרי יותר שעובד עם משפחות של אובייקטים, במקום לכתוב קוד עבור מחלקה ספציפית. בדוגמה זו, ללא קשר לאיזו מחלקה אתה מייצר, אתה יכול לגשת לכל המאפיינים והשיטות המוצהרות ב- UIControl מחלקות שעברו בירושה לכל תת המחלקות.
למשל ה UIControl לכיתה יש מופעל מאפיין, כדי שתוכל לכתוב את שורת הקוד הבאה:
למחלקת UIControl יש גם isFirstResponder שיטה, כך שתוכל לקרוא למתודה הבאה באובייקט השליטה:
סיכום
עם הזמן, ככל שתכתוב יותר אפליקציות iOS, תמצא שפע של שימושים להורשה ופולימורפיזם בבניית ספריות קוד כללי וכיתה שניתן לעשות בהן שימוש חוזר באפליקציות רבות ושונות. כמו כן, תצטרך לבצע שינויים רבים באפליקציה שלך במהלך חייה, לכן חשוב להשתמש בכלים אלה כדי להפוך את האפליקציות שלך לגמישות וניתנות להרחבה!