1 / 26

בניית מחלקות

בניית מחלקות. מה זה מחלקה?. מאפשר לנו "להרחיב" את שפת התכנות ולהגדיר סוגי נתונים חדשים. ברגע שאנו מגדירים "טיפוס" (מחלקה) חדשה, אנחנו יכולים ליצור מופעים מאותו סוג. לדוגמא : אם הגדרתי מחלקה מסוג מכונית ולייצור שני מופעים של מכוניות. מכונית 1. מכונית 2. מחלקת מכונית.

maxim
Download Presentation

בניית מחלקות

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. בניית מחלקות

  2. מה זה מחלקה? מאפשר לנו "להרחיב" את שפת התכנות ולהגדיר סוגי נתונים חדשים. ברגע שאנו מגדירים "טיפוס" (מחלקה) חדשה, אנחנו יכולים ליצור מופעים מאותו סוג. לדוגמא : אם הגדרתי מחלקה מסוג מכונית ולייצור שני מופעים של מכוניות מכונית 1 מכונית 2

  3. מחלקת מכונית אני מעוניינת לכתוב תוכנית שיש בה מכוניות. אני חייבת להחליט לשם מה אני שומרת את המכונית ולמה אני צריכה לדעת עליו class Car{ int yearDesign; string name; bool isManufacturedToday; }

  4. Car1: yearDesign:1915 Name: Ford T-Model isManufacturedToday : false Car2: yearDesign:1938 Name: Volkswagen beetle isManufacturedToday : true

  5. מחלקת נקודה יש הרבה יישומים אשר רוצים לתאר את המיקום על המשטח. לצורך כך נגדיר נקודה Point class Point{ int x; int y; } עכשיו נוכל להגדיר נקודה באופן הבא: Point p = new Point();

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

  7. תיאור המחלקה באמצעות תרשים מחלקות אם נרצה לייצג את מה שתיארנו כרגע במילים בצורה גראפית פשוטה וברורה יותר, נוכל להיעזר בתרשים מחלקות שם המחלקה Point + x : int + y : int + Set (int, int ) : void + move (int, int) : void + ToString( ) : String + Equals (Point) : boolean מאפייני המחלקה attributes שיטות המחלקה methods

  8. תרגום התרשים לקוד • נוכל להמיר את התרשים שלנו בקלות לקוד class Point{ int x; int y; public void Set(intx, int y){ this.x = x; this.y = y;} public void Move (intdx, intdy){ this.x+= dx; this.y += dy; } public override string ToString( ) { return string.Format (“”({0},{1})”,x, y);} public bool Equals (Point p) {return this.x == p.x && this.y == p.y;} }

  9. שימוש במחלקה שייצרנו public static void main (String [] args) { Point p = new Point ( ); p.Set(12, 3); Console.WriteLine(“We are at the point “ + p.ToString( )); p.Move(-2, 4); Console.WriteLine(“We are now at the point “ + p.toString( )); Point p1 = new Point (); p1.Set (5,3); if (p.Equals(p1)) Console.WriteLine(“Both points are at the same place”); else Console.WriteLine(“Both points are at different places”); }

  10. תרגול נוסף – מחלקת Time מחלקת Time מייצג טיפוס זמן. אנחנו מעוניינים לנהל זמן המורכב מדקות ושניות. פעולות שנוכל לעשות בזמן: • עדכן זמן • הצג דקות • הצג שעות • אחזר זמן בפורמט hh:mm • הוסף דקות לזמן • חשב הפרש בזמן

  11. תרשים מחלקות תרשים מחלקות Time Time + hour : int + minutes: int + set (int, int): void + getHours( ) : int + getMinutes ( ): int + toString( ) : String + addMinutes (int ) : void + difference (Time) : int

  12. בעיות בארץ המחלקות!!! אם ניקח את המחלקה שזה עתה יצרנו, נראה שיש לנו בעיה קטנה. האם הפעולה הזאת נראית חוקית? Time t = new Time( ); t.hour = 26; t.minutes = 70; קביעה האם זו חוקית נתונה פה לפרשנות. חוקית מבחינה המחשב, כן... ודאי. חוקית מ

  13. מנגנון הרשאות הגישה אחד מהיכולות של שפות מונחה עצמים הוא לקבוע מה רמת הרשאת הגישה לחלקים (data members) של המחלקה. :public גישה מותרת לכולם – גם ממחלקות אחרות private: גישה מותרת רק לחברי המחלקה כלומר רק לקוד שנכתב בתוך המחלקה אם נגדיר את המאפיינים שלנו כ-private, אנחנו נמנע את הגישה הישירה ושינוי הנתונים ללא בקרה!

  14. שימוש במנגנון הרשאות הגישה כעת נגדיר את מחלקת ה-Time שלנו באופן הבא: class Time{ private int hours; private int minutes; public void set (int hours, int minutes){…} } אם נגדיר כעת במחלקה אחרת Time t = new Time(); t.hours = 20; // פעולה לא חוקית!

  15. גישה באמצעות השיטות את השיטה נגדיר כ-public ובאמצעותו נפקח על השינויים בערכי המאפיינים. class Time{ private int hours; private int minutes; public void set (int hours, int minutes){ this.hours = hours >-1 && hours < 24? hours:0; this.minutes = minutes >-1 && minutes < 60? minutes:0; }

  16. שימוש בשיטות setters ו-getters התכונה הראשונה של תכנות עצמים נקראת כימוס. הרחבת תכונה זו ויצירת תכונת הקופסא השחורה, באה להבטיח שהאובייקט שלנו יכיל רק נתונים אמינים. אם נשאיר את הכל private לא תהיה לנו גישה למחלקה, לא לשינוי (set) ולא לצפיה (get). כדי להבטיח שנוכל לצפות בנתוני המחלקה נגדיר שיטות set ו- get שיבטיחו גישה אמינה לנתוני המחלקה

  17. פעולות get אם ניקח את מחלקת Time, נוכל להוסיף לה פעולות: public int getHours() {return this.hours;} public int getMinutes () { return this.minutes;} במידה ונרצה לדעת כמה דקות יש בזמן שהגדרנו נוכל לעשות את הפעולות הבאות: Time t = new Time(); t.set (12,30); System.out.println (“There are “ + t.getHours() + “hours”);

  18. פעולות set במקרה שלנו, הגדרנו פעולת set המאתחל את שני חלקי הזמן אבל נוכל גם אחרת public void setHours(int hours){ this.hours = hours > -1 && hours< 24?hours : 0; } public void setMinutes (int min){ this.minutes = min > -1 && min < 60? min:0; } public void set (int hours, int minutes){ this.setHours (hours); this.setMinutes (minutes); }

  19. סיכום מושגים: • אובייקט • מחלקה • מאפיינים • שיטות • כימוס • קופסא שחורה • שיטות setters ו-getters

  20. הפניות-References בגאווה יש שני סוגי נתונים: • פרימיטיבים : שהם סוגי הנתונים שמובנים בתוך השפה כמו: int, long, boolean, float, char וכו' • מחלקות: אלו הטיפוסים החדשים ש"מתווספים" לשפה הבסיסי כמו: String, Point, Random וכו' Java מתיחס באופן שונה לשני סוגי הנתונים. בעוד שהמשתנים מסוג טיפוסים פרימיטיבים יושבים בזיכרון באיזור התוכנית, המשתנים (האובייקטים) מסוג מחלקות יושבות באזור זיכרון הנקרא הערימה (heap) והמשתנה מכיל הפניה לזיכרון היכן שמורים הנתונים

  21. ארגון הזיכרון

  22. מה ההבדל בין הביטויים הבאים: מה ההבדל בקוד? Point p1 = new Point ( ); p1.set (5,5); Point p2 = new Point (); p2.set (5,5); Point p3 = p1; א. כמה אובייקטים הגדרתי? ב. איזה מבין הביטויים הבאים יחזירו אמת p1== p2 p1 == p3

  23. הצצה לזיכרון

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

  25. הוספת פעולת equals אם נחזור למחלקה Time נוסיף פעולה Equals אשר בודקת האם שני הזמנים שלפנינו זהים. public boolean equals (Time t){ return this.hours== t.hours && this.minutes == t.minutes; } כדי להשוות האם הערך זהה נכתוב כך: Time t1 = new Time (); t1.set (12,30); Time t2 = new Time( ); t2.set (12,30); if (t1.equals (t2))…

  26. סיכום הפניות מושגים : • טיפוס פרימיטיבי • טיפוס מסוג מחלקה (אובייקט) • הפניה (כתובת) • איזור זיכרון הערימה(Heap) שמירת אובייקטים נעשית באזור הזיכרון של הערימה ובמשתנה נשמר ההפניה לאזור הערימה. פעולת == בודקת האם מדובר באותה אובייקט השמור בשני משתנים שונים פעולה equals בודקת את תוכן האובייקט לראות האם הם מכילים את אותם הערכים

More Related