PracticU

ממשק - Interface בתכנות מונחה עצמים

בלי כתוביותעם כתוביות
PracticU › קורס תכנות מונחה עצמים - OOP - Object Oriented Programming - חומר לימוד של מדעי המחשב › ממשק - Interface בתכנות מונחה עצמים
מילון מושגים:
ממשק - נקודת מגע בין רכיבים: ממשק משתמש שבו אדם מפעיל תוכנה, או ממשק תכנותי שמגדיר אילו פעולות רכיב אחד חושף לאחר.
OOP - תכנות מונחה עצמים: גישת פיתוח שמארגנת את הקוד סביב אובייקטים המאגדים נתונים ופעולות.
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.
הרשאה - קביעה אילו פעולות ומשאבים מותרים למשתמש או לתהליך לאחר שזהותו אומתה. שולטת במי רשאי לעשות מה.
קומפיילר - תוכנה שממירה קוד מקור שנכתב בשפת תכנות לקוד שהמחשב יכול להריץ, ומדווחת על שגיאות תחביר.
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.

ממשק - Interface בתכנות מונחה עצמים
השיעור מציג את האינטרפייס (interface): טיפוס שמכיל הצהרות בלבד על יכולות, שמחלקה יכולה לממש בלי הגבלה.
מה אינטרפייס מכיל
1. הצהרות בלבד: אינטרפייס מכיל הצהרות על פונקציות, פרופרטיז ואיבנטים, בלי מימוש ובלי דאטה ממברס.
2. ללא הרשאת גישה: לחברים באינטרפייס לא כותבים הרשאה, כי כולם public מטבעם.
3. מימוש מרובה: מחלקה יכולה לרשת ממחלקה אחת בלבד, אבל לממש כמה אינטרפייסים. גם struct יכול לממש אינטרפייסים.
למה להשתמש באינטרפייס
1. תיאור יכולת: אינטרפייס מתאר פעילות שלמה, למשל אוסף שחייב לנקות, להוסיף ולמחוק פריטים, כך ששום פעולה לא נשכחת.
2. זיהוי אחיד: כשמחלקה ממשת IDisposable עם הפונקציה Dispose, מי שמשתמש בה יודע שהפונקציה נועדה לשחרר משאבים.
3. חוזה בין מחלקות: מי שמממש אינטרפייס מתחייב לממש את כל החברים שבו, ומי שמשתמש בו יודע מה לצפות.
דוגמה: נגן
1. יצירה: בוחרים New Item ואז Interface. לפי המוסכמה השם מתחיל ב-I, למשל IPlayer.
2. מימוש: DVD ממש את IPlayer עם Play, Pause, Stop, Forward ו-Backward. הקומפיילר מציג שגיאות עד שכל הפונקציות ממומשות.
3. השלד האוטומטי: מניחים את הסמן על שם האינטרפייס ולוחצים Ctrl+., ואז בוחרים את האפשרות ליצור את המימוש.
4. התוכן: האינטרפייס חוסך את השמות והחתימות, אבל כל מחלקה כותבת את התוכן שלה, כי נגן רדיו ונגן DVD מנגנים בצורות שונות.
שימו לב
Toaster ו-DVD יורשים את ElectronicDevice, אבל רק DVD ממש את IPlayer. לכן לפני קריאה ל-Play בודקים אם האובייקט הוא IPlayer בעזרת is או as, ולא אם הוא DVD. כך אפשר להגדיר יכולת משותפת לכמה מחלקות שונות, ולדעת שהפונקציות שלה קיימות בכל אחת מהן.
השיעור הבא בקורס: הבדל בין Interface ל-Abstract Class

פרקי ההרצאה: ממשק - Interface בתכנות מונחה עצמים

  1. 00:00

    מהו Interface ב-Object Oriented

  2. 00:54

    הצהרות על פונקציות בלבד

  3. 02:14

    מימוש Interface על ידי מחלקה

  4. 05:31

    למה לקבל יכולות מ-Interface

  5. 08:34

    Interface כחוזה Contract

  6. 09:47

    עץ הורשה לרכיבים אלקטרוניים

  7. 15:26

    בניית ה-Interface של נגן

  8. 18:10

    מימוש ה-Interface במחלקה

תמלול ההרצאה: ממשק - Interface בתכנות מונחה עצמים

הטקסט המלא של הדקות הראשונות בהרצאה «ממשק - Interface בתכנות מונחה עצמים» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:01

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

  2. 00:24

    אנחנו ראינו שבאובג'קט אוריינטד יש בעצם אינקפסוליישן, יש הורשה, יש פולימורפיזם, שלושת אבני הבניין של Object Oriented בנוסף יש כל מיני פקודות וכלים נלווים לשפה עצמה לדוגמה ראינו את Abstract כעת אנחנו מגיעים לאינטרפייס שזה גם כן כלי נוסף ששייך לעולם ה-Object Oriented אז בואו נסתכל קודם כל מה זה

  3. 00:49

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

  4. 01:07

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

  5. 01:19

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

  6. 01:43

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

  7. 02:03

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

  8. 02:21

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

  9. 02:34

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

  10. 02:49

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

  11. 03:11

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

  12. 03:23

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

  13. 03:57

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

  14. 04:23

    כל העץ וכל מיני מחלקות הולכות לרשת את המחלקה האבסטרקטית. כאן אנחנו רואים שהמחלקות בסגול נקראות Concrete Class. קונקריט זו מחלקה אמיתית שניתן לבנות ממנה אובייקט, כלומר היא לא אבסטרקטית.

  15. 04:40

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

  16. 05:09

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

  17. 05:42

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

  18. 06:00

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

  19. 06:21

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

  20. 06:37

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

  21. 07:04

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

  22. 07:16

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

  23. 07:29

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

  24. 07:47

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

  25. 08:15

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

  26. 08:39

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

  27. 08:59

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

  28. 09:18

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

  29. 09:30

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

  30. 09:48

    לכן כנראה שהולכת להיות לנו איזושהי מחלקת בסיס, ונקרא לה Electronic Device, והיא תהווה מחלקת בסיס עבור כל המחלקות שמתארות רכיבים אלקטרוניים שלנו.

  31. 10:10

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

  32. 11:26

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

  33. 11:52

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

  34. 12:10

    בואו נניח שאנחנו מוסיפים לה Max Heat, כלומר החום המקסימלי שהטוסטר יכול להכיל. נבנה פה איזשהו C-Tor, אחד שמקבל את כל הפרמטרים, אנחנו יכולים אפילו להגיק את אלה מפה, ולהוסיף Max Heat.

  35. 12:48

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

  36. 13:33

    בואו נעתיק את כל המחלקה הזאת כדי שיהיה פשוט ונבנה עוד מחלקה שקיימת לנו במעבדה והיא מתארת DVD. בואו נשנה כאן את מה שצריך ל-DVD, יש לנו פה קונסטרקטור, ל-DVD יש משתנה בולעני שנקרא can read non-original disk.

  37. 14:25

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

  38. 15:45

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

  39. 16:11

    אז אנחנו עכשיו רוצים שהיכולת הזאת בעצם תגיע מאיזשהו אינטרפייס. אנחנו יכולים לגשת לפרויקט שלנו ואנחנו יכולים לצרף New Item ולבחור לא Class אלא Interface.

  40. 16:27

    אנחנו רואים את זה פה. לפי מוסכמה נהוג שאינטרפייס יתחיל ב-I גדולה ואז השם. אם אנחנו אגן וידאו אז השם של האינטרפייס יהיה I Layer ואנחנו רואים שפשוט לבנות אינטרפייס מאוד דומה לבנייה של קלאס.

  41. 16:45

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

  42. 17:10

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

  43. 17:33

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

  44. 18:10

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

  45. 18:37

    איך עושים את זה? מחלקה יכולה לרשת מחלקה אחת כמו שאנחנו רואים כאן, ובעזרת פסיק אנחנו יכולים להמשיך ולרשת אינטרפייסים.

  46. 18:46

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

  47. 19:06

    אם אני אריץ עכשיו קומפילציה אני אחטוף הרבה שגיאות על המחלקה DVD. בואו נסתכל ונראה שיש לי פה חמש שגיאות כי לא מימשתי חמש פונקציות שקיימות באינטרפייס.

  48. 19:19

    טוב, איך אנחנו עושים את זה? יש לנו פה את הקיצור הזה שאנחנו יכולים ללחוץ עליו ולכתוב Implement Interface iPlayer, או עדיף כמובן לא לגעת בעכבר,

לקורס המלא: קורס תכנות מונחה עצמים OOP

ההרצאה הקודמת: מחלקה אבסטרקטית - Abstract Class

ההרצאה הבאה: הבדל בין Interface ל-Abstract Class

הרצאות קשורות מקורסים אחרים

  • תכנות מונחה עצמים ב-NodeJS
  • עקרונות תכנות מונחה עצמים - Unity OOP
  • אובייקטים ומחלקות CLASS - תכנות מונחה עצמים בשפת Dart
  • יצירת interface ב-TypeScript

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת C# .NET - קורס תכנות למתחילים - דוט-נט / סי-שארפ - חומר לימוד של מדעי המחשב