PracticU

בנאי המחלקה Constructor

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

בנאי המחלקה Constructor
הסרטון מציג בנאי (constructor), פונקציה מיוחדת שמופעלת בזמן יצירת אובייקט ומאפשרת לאתחל אותו בערכים מההתחלה.
השלבים העיקריים
1. הבעיה: כשמשתמשים במחלקה, קודם יוצרים אובייקט ואחר כך מכניסים לו ערכים אחד אחרי השני. בנאי מאפשר לשלוח את הערכים כבר ביצירה.
2. כתיבת בנאי: הבנאי נקרא בשם המחלקה, יש לו הרשאת גישה public, ואין לו ערך מוחזר, גם לא void. הוא מקבל את הפרמטרים, למשל string productName.
3. הכנסה דרך פרופרטי: הבנאי מעביר את הערכים לתוך ה-data members דרך פרופרטי. אם יש לפרופרטי בדיקה, היא מופעלת.
4. העמסת בנאים: אפשר לכתוב כמה בנאים עם מספר פרמטרים שונה. כך מתכנת שיודע רק את שם המוצר והמחיר יכול להשתמש בבנאי שמקבל שניים.
5. רשימת אתחול: בנאי יכול לקרוא לבנאי אחר של המחלקה בעזרת : this(productName, price), ובכך לחסוך שורות קוד חוזרות. במצב דיבאג רואים את הקפיצה בין הבנאים.
6. בנאי ריק: אם כתבנו בנאי כלשהו, המערכת לא מייצרת בנאי ריק. כדי לאפשר יצירת אובייקט בלי ערכים צריך לכתוב אותו בעצמנו.
שימו לב
קיצור ctor ואחריו Tab פעמיים יוצר שלד של בנאי. מחלקה מתארגנת לאזורים בעזרת #region: data members, constructors, properties ומתודות.
בנאי נותן למשתמש של המחלקה את האפשרות לשלוח את כל הערכים בשורה אחת, ולכן כותבים כמה בנאים לפי הערכים שמתקבלים בדרך כלל.
השיעור הבא בקורס: בנאי המחלקה Constructor (הסבר נוסף)

פרקי ההרצאה: בנאי המחלקה Constructor

  1. 00:00

    הצורך בבנאי Constructor

  2. 03:03

    הסוגריים ביצירת האובייקט

  3. 04:03

    בניית הקונסטרקטור

  4. 05:26

    הכנסת ערכים דרך הפרופרטי

  5. 08:48

    סידור נכון של המחלקה

  6. 09:26

    קריאה לקונסטרקטור ביצירת אובייקט

  7. 13:58

    המסת קונסטרקטורים

  8. 17:45

    בנאי ברירת מחדל - Default Constructor

תמלול ההרצאה: בנאי המחלקה Constructor

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

  1. 00:01

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

  2. 00:17

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

  3. 00:32

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

  4. 00:53

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

  5. 01:50

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

  6. 02:13

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

  7. 02:32

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

  8. 02:55

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

  9. 03:18

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

  10. 03:43

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

  11. 04:04

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

  12. 04:17

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

  13. 04:34

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

  14. 04:56

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

  15. 05:09

    לכן בואו נרשום כאן String Product Name, String Category Name ו-Decimal Price. מה על הקונסטרקטור לבצע? על הקונסטרקטור להכניס את הערכים שהוא קיבל ישירות ל-Data Members, אבל אם כמובן ערך צריך לעבור דרך איזשהו פרופרטי אני כמובן לא רוצה להכניס אותו ישירות לדאטה ממבר

  16. 05:43

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

  17. 05:56

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

  18. 06:13

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

  19. 06:26

    אז קודם כל מה שאנחנו רוצים לעשות זה לגשת לדאטה ממברס שנקרא product name עם פי גדולה ולהכניס אליו את המשתנה שקיבלנו product name עם פי קטנה. מאוד מקובל שהשמות האלה יהיו ממש זהים, לא נהוג בתכנות לרשום לדוגמה pn עבור product name, אף אחד אחר כך לא מבין מה זה או p-name או כל מיני המצאות כאלה נהוג שהשמות יהיו כמה שיותר ברורים וממש זהים לשמות של ה-data

  20. 06:58

    members כמובן עם אותיות שונות מבחינת k-sensitive category name שזה ה-data member כי זה עם c גדולה הולך לקבל את category name עם c קטנה שזה המשתנה שנשלח לקונספקטור price עם p גדולה אז הפרופרטי הולך לקבל את פרייס עם שיא קטנה שזה המשתנה הזה שנשלח לקונסטרקטור וכך גם אם מתכנת ב' שולח לקונסטרקטור מחיר המחיר עובר דרך הפרופרטי

  21. 07:34

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

  22. 08:04

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

  23. 08:49

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

  24. 09:09

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

  25. 09:27

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

  26. 09:52

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

  27. 10:10

    אפל, פרוץ ו-2.3M ושימו לב שחסכנו שלוש שורות קוד במקרה הזה אם אין לנו עשרה data members והיינו יודעים את כולם היינו חוסכים 10 שורות קוד.

  28. 10:29

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

  29. 10:40

    לאחר מכן בואו נדפיס אותם first product print וניצור לעצמנו עוד מוצר. זה יהיה second product קודם זה היה 4.5 מכל זה אפשר להיפטר. הקוד כרגע הרבה הרבה יותר מצומצם עבור מתכנת ב' בואו נריץ ואנחנו רואים שכל הערכים מוצגים על המסך.

  30. 11:23

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

  31. 11:41

    מה הערכים שהתקבלו לקונסטרקטור? אנחנו יכולים לראות את ה-Product Name שנשלח, Apple, את ה-Categoria, Fruits, ואת ה-מחיר, במקרה הזה 2.3. התפקיד של הקונסטרקטור זה להתחיל את משתנה המחלקה ולכן הוא הולך ועבור האובייקט הנוכחי שהוא כמובן first product

  32. 12:04

    הוא מכניס את הערכים לdata members פה נכנס הproduct name לאחר מכן הcategory name ולבסוף הפרייס עובר דרך הפרופרטי בכדי לגלות האם הוא אכן חוקי או לא אנחנו רואים כרגע שהvalue הוא כמובן ה2.3 זה חוקי והוא נכנס לתוך הדאטה ממבר פרייס עם פי קטנה.

  33. 12:30

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

  34. 13:05

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

  35. 13:44

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

  36. 14:05

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

  37. 14:40

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

  38. 14:53

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

  39. 15:11

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

  40. 15:24

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

  41. 15:51

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

  42. 16:28

    מכן לקבל מהמשתמש או לקלוט מקובץ או להשיג מכל מקור אחר את הנתונים ולבוא ולהכניס את הנתונים בעצמו לערכים product name אמור להיות public אוקיי אז פתאום אנחנו רואים שיש לנו כאן איזושהי בעיה ויש פה שקיעת קומפילציה ואם אנחנו עומדים עליה אנחנו רואים שהמערכת אומרת לנו product does not not contain a constructor that takes zero arguments כלומר אין לכם קונסטרקטור שמקבל

  43. 17:18

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

  44. 17:42

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

  45. 18:10

    שלא מקבל שום דבר בכדי שמתכנת ב' יוכל ליצור אובייקט בצורה כזאת מהמחלקה שלכם הקונסטרקטור הזה נקרא default constructor הוא לא עושה בעצם כלום והוא לא מקבל שום פרמטרים אבל פה ממשיך הכלל ואומר אם אתם בניתם קונסטרקטור

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

ההרצאה הקודמת: Properties של Class (הסבר נוסף)

ההרצאה הבאה: בנאי המחלקה Constructor (הסבר נוסף)

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

  • פעולת בנאי - init עבור structs

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

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