Presentation is loading. Please wait.

Presentation is loading. Please wait.

הכלת אובייקטים קרן כליף.

Similar presentations


Presentation on theme: "הכלת אובייקטים קרן כליף."— Presentation transcript:

1 הכלת אובייקטים קרן כליף

2 ביחידה זו נלמד: הכלת מחלקות מתי נחזיק העתק ומתי הפניה

3 הכלת מחלקות: מוטיבציה וכיצד זה עובד
כאשר יש מחלקה שאחד השדות שלה הוא מחלקה אחרת דוגמא: נתוני המחלקה "עיגול" יהיו "נקודה" המיצגת את המרכז ואורך הרדיוס נתוני המחלקה "נקודה" הן קאורידנטת ה- x וקאורדינטת ה- y כאשר אובייקט מכיל אובייקט אחר, הוא למעשה מכיל הפניה לאובייקט המוכל (אלא אם המוכל נוצר ע"י new) תזכורת: העברת אובייקטים לשיטה היא by ref, כלומר מועברת הפניה לאובייקט ולא העתק שלו

4 הקוד 1 1 5 public class Point { private int x, y;
public Point(int x, int y) { setX(x); setY(y); } public Point(Point other) { this(other.x, other.y); public String toString() { return "(" + x + ", " + y + ")"; public void setX(int x) {this.x = x;} public int getX() {return x;} public void setY(int y) {this.y = y;} public int getY() {return y;} } // class Point public class Circle { private Point center; private int radius; public Circle(Point center, int radius) { this.center = center; this.radius = radius; } public String toString() { return "center: " + center.toString() + ", radius: " + radius; public int getRadius() {return radius;} public Point getCenter() {return center;} } // class Circle 5 public class Program { public static void main(String[] args) { Point p = new Point(1, 1); Circle c = new Circle(p, 5); System.out.println("c is " + c.toString()); p.setX(0); c.getCenter() } x=0 y=0 x=0 y=1 x=1 y=1 x=0 y=20 Point: p Circle: c center = radius = 0 .setY(20); center = radius = 5

5 הבעיה: ראינו שהאובייקט Circle מכיל הפניה לאובייקט המוכל מטיפוס Point
כלומר, שינוי באובייקט המוכל מה- main גורר שינוי באובייקט Circle לא בהכרח נרצה שינוי זה או נהייה מודעים לו (ככותבי המחלקה אנו לא יודעים כיצד ישתמשו במחלקה שלנו, ונרצה להגן עליה) הפתרון: במחלקה המכילה נחזיק העתק של האובייקט המוכל

6 הקוד 1 1 5 public class Point { private int x, y;
public Point(int x, int y) { setX(x); setY(y); } public Point(Point other) { this(other.x, other.y); public String toString() { return "(" + x + ", " + y + ")"; public void setX(int x) {this.x = x;} public int getX() {return x;} public void setY(int y) {this.y = y;} public int getY() {return y;} } // class Point public class Circle { private Point center; private int radius; public Circle(Point center, int radius) { this.center = center; this.radius = radius; } public String toString() { return "center: " + center.toString() + ", radius: " + radius; public int getRadius() {return radius;} public Point getCenter() {return center;} } // class Circle 5 public class Program { public static void main(String[] args) { Point p = new Point(1, 1); Circle c = new Circle(p, 5); System.out.println("c is " + c.toString()); p.setX(0); c.getCenter() } x=0 y=1 x=1 y=1 x=1 y=20 x=1 y=1 x=0 y=0 Point: p Circle: c center = radius = 0 .setY(20); center = radius = 5

7 דוגמת הכתובת ובית הספר (1)
דוגמת הכתובת ובית הספר (1)

8 דוגמת הכתובת ובית הספר (2)
את כתובת הבית נשמור כהעתק ואת כתובת בית הספר כהפניה

9 ה- main public class Program {
public static void main(String[] args) { Address school = new Address("Balfur", 10, "Tel-Aviv"); Address home = new Address("Geula", 20, "Tel-Aviv"); Student stud1 = new Student("gogo", home, school); home.setHouseNumber(8); Student stud2 = new Student("momo", home, school); school.setHouseNumber(90); stud2.getHomeAddress() } ה- main street=“Balfur” number=90 city=“Tel-Aviv” street=“Balfur” number=10 city=“Tel-Aviv” street=“Geula” number=8 city=“Tel-Aviv” street=“Geula” number=20 city=“Tel-Aviv” .setHouseNumber(30); street=“Geula” number=20 city=“Tel-Aviv” name=“gogo” homeAddress= schoolAddress= Address: school Address: home Student: stud1 Student: stud2 street=“Geula” number=30 city=“Tel-Aviv” street=“Geula” number=8 city=“Tel-Aviv” name=“momo” homeAddress= schoolAddress=

10 אובייקט מוכל: מתי נחזיק העתק ייחודי ומתי הפניה לאובייקט אחר
ננתח את המערכת הבאה המנהלת את כוח-האדם בחברה: במחלקת ה- HR יש נתונים על כל העובדים בחברה בכל אגף יש נתונים על העובדים השייכים אליו ה- HR אינה מקושרת למשרד הפנים, ולכן יהיה צורך לעדכן אותה בכל שינוי בנתוניו של עובד כלשהו ה- HR באופן בלעדי אחראית על שינוי נתוני העובדים בחברה

11 אובייקט מוכל: מתי נחזיק העתק ייחודי ומתי הפניה לאובייקט אחר
HR Employee[] allEmployees Employee[] allEmployees Employee[] allEmployees Employee[] allEmployees name: qa name: r&d name: finance Department[] allDepartments

12 אובייקט מוכל: מתי נחזיק העתק ייחודי ומתי הפניה לאובייקט אחר (2)
מחלקת ה- HR מחזיקה את נתוני העובדים באופן ייחודי, כלומר אין אליהם הפניה ממקור חיצוני למערכת (למשל ה- main) שינוי נתוני העובד במשרד הפנים (main) ידרוש עדכון גם ב- HR כך גם ה- HR מגנה על הנתונים הספציפיים לה, כגון משכורת העובד. לא נרצה שב- main ניתן יהיה לשנות ערך זה ללא בקרה או ללא בקשה מפורשת מה- HR לעומת זאת, מאחר וכל נתוני העובדים נשמרים ב- HR, מספיק שכל אגף בחברה תחזיק הפניה לעובדים המשוייכים אליו, מתוך מאגר העובדים המוחזק ע"י ה- HR. שינוי בנתוני עובד ב- HR תעדכן מיידית בנתוניו באגף, ולהיפך.

13 הקוד

14 הקצאת מערך האובייקטים

15 הפניה לאובייקט שהתקבל

16

17

18 שתי מתודות אלו מקבלות שם של מחלקה (String), ומחזירות הפניה לאיבר במערך

19

20 יש לשקול להחזיר int שונה בכל מקרה במקום boolean.
העתק לאובייקט שהתקבל המתודה addEmployee מחזירה false במידה ולא הצליחה. ה- main שמקבל את ה- false אינו יכול לדעת האם המתודה נכשלה כי אין מקום או האם בגלל שהמחלקה אינה קיימת. יש לשקול להחזיר int שונה בכל מקרה במקום boolean.

21 ה- Program

22 ה- Program

23 ה- Program

24 ה- Program

25 ה- Program

26 דוגמת פלט

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

28 דוגמת פלט

29 דוגמת פלט

30 דוגמת פלט

31 ביחידה זו למדנו: © Keren Kalif הכלת מחלקות מתי נחזיק העתק ומתי הפניה

32 תרגיל: מערכת ניהול הנסיעות בחברת אוטובוסים
בחברת אוטובוסים לכל אוטובוס יש מספר לוחית רישוי ומספר מקומות ישיבה נתון כי בחברת אוטובוסים יכולים להיות עד 100 אוטובוסים וכן יש לשמור את שם החברה יש לתמוך בהוספת אוטובוס למאגר, והסרת אוטובוס מהמאגר (הסרה עפ"י מספר לוחית הרישוי) כתבו מתודת toString בכל אחת מהמחלקות כתבו main הבודק את המחלקות

33 תרגיל: מערכת ניהול הנסיעות בחברת אוטובוסים (המשך)
המערכת מחזיקה את קווי הנסיעה (מספר הקו, מקור ויעד) ניתן להניח שבמערכת יש עד 50 קווים המערכת מנהלת את הנסיעות: נתוני נסיעה: תאריך, שעת יציאה, קו הנסיעה, האוטובוס המשובץ לנסיעה יש לאפשר עדכון נתוני הנסיעה יש לאפשר הוספה והסרה של נסיעות מלוח הזמנים ניתן להניח שהמערכת תומכת עד 1000 נסיעות כתבו main הבודק את המחלקות


Download ppt "הכלת אובייקטים קרן כליף."

Similar presentations


Ads by Google