PracticU

המחלקה Object

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

המחלקה Object
השיעור מסביר את מחלקת Object, מחלקת הבסיס של כל הטיפוסים ב-.NET, ואת הפונקציות שלה שכדאי לדרוס במחלקות שכותבים.
מחלקת Object
1. בסיס לכל הטיפוסים: כל מחלקה וכל struct יורשים מ-Object, גם בלי לכתוב זאת. לכן רפרנס מסוג object יכול להחזיק כל דבר: מספר, מחרוזת או אובייקט של Person.
2. שימושים: פונקציה שמקבלת object מקבלת כל ערך, וכך גם מערך מסוג object. בדרך כלל כדאי לצמצם את מה שנכנס למערכים.
3. ירושה עקיפה: מחלקה שיורשת Person מקבלת גם את הפונקציות של Object, כי Person כבר יורש אותן.
ארבע הפונקציות
1. ToString: מחזיר מחרוזת שמתארת את האובייקט. ברירת המחדל מחזירה רק את שם המחלקה, ולכן כדאי לדרוס אותה ולהחזיר למשל את השם המלא.
2. GetHashCode: מחזיר מזהה מספרי שמייחד את האובייקט. במחלקת Person כדאי להחזיר את ה-ID. מחלקות האוספים של .NET משתמשות בפונקציה הזאת.
3. Equals: משווה בין האובייקט הנוכחי לאובייקט שנשלח. ברירת המחדל משווה כתובות, כך ש-p1.Equals(p2) יחזיר false גם כשהתוכן זהה. דורסים את הפונקציה כדי להשוות לפי ה-ID.
4. GetType: מחזיר אובייקט Type שמתאר את המחלקה עצמה ולא את האובייקט. היא אינה וירטואלית, ואין צורך לדרוס אותה.
שתי פונקציות סטטיות
1. Object.Equals: מקבלת שני אובייקטים ומשווה ביניהם לפי הפונקציה Equals שדרסנו.
2. Object.ReferenceEquals: בודקת אם שני רפרנסים מצביעים על אותו מקום בזיכרון.
דרישות לדריסה
1. Equals: קודם בודקים שהאובייקט שהתקבל הוא Person, בעזרת as או is, ורק אז ניגשים ל-ID. כך לא מקבלים null ושגיאה.
2. מחרוזות: string הוא טיפוס מיוחד שאינו ניתן לשינוי. שתי מחרוזות זהות שנכתבו בקוד מצביעות לאותו אובייקט, ולכן Equals מחזיר עבורן true.
שימו לב
הפונקציות של Object קיימות בכל מחלקה, ומתכנתים אחרים מצפים שיעבדו בצורה מוכרת. לכן כדאי לדרוס אותן כך שיחזירו את מה שהמחלקה צריכה. כעת אפשר לדרוס את ארבע הפונקציות בכל מחלקה, כך שההשוואה וההדפסה יתאימו לתוכן האמיתי של האובייקט.
השיעור הבא בקורס: טיפול בחריגות - Exception Handling

פרקי ההרצאה: המחלקה Object

  1. 00:00

    המחלקה Object מכילה הכל

  2. 02:25

    הכנסת אובייקט Person ל-Object

  3. 03:28

    Object כמחלקת הבסיס של הכל

  4. 06:43

    ארבע הפונקציות בכל אובייקט

  5. 07:45

    הפונקציה ToString

  6. 09:24

    דריסת ToString ב-Person

  7. 11:00

    הפונקציה GetHashCode

  8. 13:16

    הפונקציה Equals והשוואת אובייקטים

תמלול ההרצאה: המחלקה Object

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

  1. 00:01

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

  2. 00:21

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

  3. 00:52

    בואו נבנה מחלקה משלנו, נבנה מחלקה פשוטה, person, נשים אותה סייד ביי סייד, נבנה first name, last name, נבנה פה איזשהו ID, איזשהו ctor rec, ctor שמקבל את כל הפרמטרים ופונקציית print שמציגה את כל הפרמטרים.

  4. 01:58

    יש לנו כאן את ה-ID, יש לנו כאן את ה-First Name ויש לנו כאן את ה-Last Name. עכשיו, האם אנחנו יכולים ליצור אובייקט פרסון משלנו ולהכניס אותו גם לתוך האובייקט?

  5. 02:34

    אז ניצור New Person, ניתן לו איזשהו ID וניתן לו איזשהו First Name ו-Last Name. וכעת אנחנו רואים שכל הסיפור הזה עבר קומפילציה בלי בעיה וניתן לביצוע.

  6. 03:08

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

  7. 03:20

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

  8. 03:35

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

  9. 03:43

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

  10. 03:59

    איך זה יכול להיות? השיטה היחידה שהדבר הזה היה יכול להתקיים בהתאם לחוקים של אובייקט אוריינטד, זה היה אם המחלקה Object היא הייתה מחלקת הבסיס של כל האובייקטים ב-dotnet.

  11. 04:14

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

  12. 04:43

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

  13. 05:19

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

  14. 05:40

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

  15. 06:21

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

  16. 06:40

    אם אנחנו רושמים myobject. אנחנו רואים שיש כאן את ארבעת הפונקציות האלה ואכן ארבעת הפונקציות האלה קיימות כל אובייקט בעולם בדוטנט גם בפרסון שלנו הן קיימות אם אני כרגע ארשום פה איזה שהוא דיס נקודה אני אראה את ה-id first name last name ו-print אבל אני אראה עוד דברים אני רואה פה equals

  17. 07:07

    אני רואה פה get hash code get type to string כל מיני פונקציות שלא אני כתבתי והן היו חייבות להגיע ממחלקת הבסיס מחלקת הבסיס שלי זה object אז כדאי לנו מאוד לדעת מה בדיוק הפונקציות האלה מציינות אז בואו נסתכל מה הן אומרות.

  18. 07:31

    נוריד מפה כל אלה, נחזור למצב שבו יש לנו Object OBJ שווה 123. נתחיל עם הפונקציה הכי פשוטה, 2String. 2String לפי מה שכתוב, Returns a String that represents the current Object.

  19. 07:56

    האובייקט הנוכחי שלי זה המספר 123 שפשוט הכנסתי אותו לתוך רפרנס ה-OBJ. ואם אני קורא ל-2String שלו ומציג אותה, מה שהוא מחזיר לי זה מכרוזת שמתארת את האובייקט, האובייקט שלי זה 123 אז המכרוזת שתוחזר תהיה 123. תשימו לב הוא לא מחזיר לי מספר, הוא מחזיר לי מכרוזת, זאת אומרת אם נעשה פה סטרינג

  20. 08:21

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

  21. 08:34

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

  22. 08:50

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

  23. 09:24

    ולא מחרובת שמתארת מחלקה. לצורך כך אנחנו יכולים ללכת ולדרוס את 2-String מפני ש-2-String באובייקט היא וירטואלית ולתת לה מימוש יותר מתאים.

  24. 09:39

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

  25. 10:01

    שמתארת את האובייקט הגיוני להחזיר לדוגמה first name רווח last name כך אנחנו נוכל לתאר בדיוק את השם המלא של האובייקט בוא נניח שאני לא צריך בתיאור הכללי של האובייקט את ה-id שלו עכשיו two-string בגלל שהיא וירטואלית המימוש שהתבצע יהיה זה שקיים במחלקה של האובייקט בזיכרון

  26. 10:30

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

  27. 10:45

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

  28. 11:02

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

  29. 11:17

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

  30. 11:42

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

  31. 11:55

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

  32. 12:15

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

  33. 12:41

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

  34. 13:03

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

  35. 13:16

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

  36. 13:32

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

  37. 13:50

    בואו נניח שבשביל שזה יהיה יותר מובן נרשום person פי אחת. יש לנו אובייקט person, אנחנו רוצים לקרוא ל-equals. אז פי אחת הוא האובייקט הראשון שזה ה-dataMembers שלו, והאובייקט השני שמתבצע השוואה איתו זה האובייקט שנשלח לפונקציה.

  38. 14:19

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

  39. 14:27

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

  40. 14:46

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

  41. 14:58

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

  42. 15:33

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

  43. 16:11

    שווים אנחנו רואים שהם שווים מבחינתנו p1 וp2 מכילים את אותו ה-id וזה כבר מספיק בשביל שהם יהיו שווים כי אם יש לנו שני אובייקטים שמתארים אנשים עם אותה תעודת זהות ואותו בן אדם.

  44. 16:27

    בואו נראה מה עכשיו המערכת תגיד לנו. עדיין false. רגע, הפונקציה תמיד מחזירה false? הפונקציה לא מחזירה תמיד false. לדוגמה, אם היינו בודקים האם p1 נקודה equals p1, היינו רואים שהמערכת הייתה אומרת לנו true.

  45. 16:46

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

  46. 16:56

    person שקיבל את אותה כתובת של p1 ולכן גם p1 וגם p3 מצביעים על אותו האובייקט בדיוק ואם אנחנו היינו רושמים p1 equals p3 היינו מקבלים true ואם היינו רושמים p3 equals p1 גם היינו מקבלים true מפני שמבחינת המערכת זאת אותה הכתובת אבל זה לא היה מספיק טוב לנו מפני שכעת אם אנחנו רושמים p1 equals p2 אנחנו רוצים שהמערכת תדע שיש לנו פה שני אובייקטים שהם זהים לא שונים כעת

  47. 18:00

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

  48. 18:29

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

  49. 18:45

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

  50. 19:12

    אם ה-ID שלנו שווה לזה שהתקבל לפונקציה אנחנו יודעים שזה אותו בן אדם ועלינו להחזיר true באונריקס ונראה בעצם שקיבלנו true. אחרת אנחנו יכולים להחזיר false אנחנו אמורים להחזיר false.

  51. 19:32

    זאת אומרת אם היינו בונים פה איזשהו person p3 והיינו שמים פה ערכים אחרים וזאת הייתה dana לוי האם p1 שווה p3 תשובה

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

ההרצאה הקודמת: הבדל בין Interface ל-Abstract Class

ההרצאה הבאה: טיפול בחריגות - Exception Handling

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

  • Object Serialization
  • Session object - חלק 1
  • Powershell object
  • Page Object Design - חלק 1

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

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