בניית מחלקות

26
תתתתת תתתתתת

Upload: maxim

Post on 12-Jan-2016

35 views

Category:

Documents


8 download

DESCRIPTION

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

TRANSCRIPT

Page 1: בניית מחלקות

בניית מחלקות

Page 2: בניית מחלקות

מה זה מחלקה?

מאפשר לנו "להרחיב" את שפת התכנות ולהגדיר סוגי נתונים חדשים.

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

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

2מכונית

Page 3: בניית מחלקות

מחלקת מכונית

אני מעוניינת לכתוב תוכנית שיש בה מכוניות.

אני חייבת להחליט לשם מה אני שומרת את המכונית ולמה אני צריכה לדעת עליו

class Car{int yearDesign;

string name;

bool isManufacturedToday;

}

Page 4: בניית מחלקות

Car1:yearDesign:1915Name: Ford T-ModelisManufacturedToday : false

Car2:yearDesign:1938Name: Volkswagen beetleisManufacturedToday : true

Page 5: בניית מחלקות

מחלקת נקודה

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

Pointנקודה

class Point{int x;

int y;

}

עכשיו נוכל להגדיר נקודה באופן הבא:

Point p = new Point)(;

Page 6: בניית מחלקות

התנהגויות המחלקה

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

או מה הם התנהגויות שלנו יכולה לעשותהאובייקט שלנו.

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

מסויים אנחנו יכולים לבדוק האם הנקודה שלנו זהה

לנקודה אחרת.

Page 7: בניית מחלקות

תיאור המחלקה באמצעות תרשים מחלקות

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

יותר, נוכל להיעזר בתרשים מחלקות

Point

+ x : int

+ y : int

+ Set )int, int ( : void

+ move )int, int( : void

+ ToString ) ( : String

+ Equals )Point( : boolean

שם המחלקה

מאפייני המחלקהattributes

שיטות המחלקהmethods

Page 8: בניית מחלקות

תרגום התרשים לקוד

נוכל להמיר את התרשים שלנו בקלות לקודclass Point{

int x;int y;public void Set)int x, int y({

this.x = x;this.y = y;}

public void Move )int dx, int dy({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;}

}

Page 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”(;elseConsole.WriteLine )“Both points are at different places”(;}

Page 10: בניית מחלקות

Timeתרגול נוסף – מחלקת

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

פעולות שנוכל לעשות בזמן:עדכן זמןהצג דקותהצג שעות אחזר זמן בפורמטhh:mmהוסף דקות לזמןחשב הפרש בזמן

Page 11: בניית מחלקות

תרשים מחלקות

Timeתרשים מחלקות Time

+ hour : int

+ minutes: int

+ set )int, int(: void

+ getHours) ( : int

+ getMinutes ) (: int

+ toString) ( : String

+ addMinutes )int ( : void

+ difference )Time( : int

Page 12: בניית מחלקות

בעיות בארץ המחלקות!!!

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

האם הפעולה הזאת נראית חוקית?Time t = new Time) (;t.hour = 26;t.minutes = 70;

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

Page 13: בניית מחלקות

מנגנון הרשאות הגישה

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

(data members.של המחלקה ):public גישה מותרת לכולם – גם ממחלקות

אחרותprivate גישה מותרת רק לחברי המחלקה :

כלומר רק לקוד שנכתב בתוך המחלקה, privateאם נגדיר את המאפיינים שלנו כ-

אנחנו נמנע את הגישה הישירה ושינוי הנתונים ללא בקרה!

Page 14: בניית מחלקות

שימוש במנגנון הרשאות הגישה

שלנו באופן הבא:Timeכעת נגדיר את מחלקת ה-class Time{

private int hours;private int minutes;public void set )int hours, int minutes({…}}

אם נגדיר כעת במחלקה אחרתTime t = new Time)(;t.hours = 20; // פעולה לא חוקית!

Page 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;}

Page 16: בניית מחלקות

settersשימוש בשיטות gettersו-

התכונה הראשונה של תכנות עצמים נקראת .כימוס

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

אמינים.

לא תהיה לנו גישה privateאם נשאיר את הכל (.get( ולא לצפיה )setלמחלקה, לא לשינוי )

כדי להבטיח שנוכל לצפות בנתוני המחלקה נגדיר שיבטיחו גישה אמינה לנתוני get ו- setשיטות

המחלקה

Page 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”(;

Page 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(;

}

Page 19: בניית מחלקות

סיכום

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

Page 20: בניית מחלקות

Referencesהפניות-

בגאווה יש שני סוגי נתונים: פרימיטיבים : שהם סוגי הנתונים שמובנים בתוך

וכו'int, long, boolean, float, charהשפה כמו: "מחלקות: אלו הטיפוסים החדשים ש"מתווספים

וכו'String, Point, Randomלשפה הבסיסי כמו: Java.מתיחס באופן שונה לשני סוגי הנתונים

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

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

לזיכרון היכן שמורים הנתונים

Page 21: בניית מחלקות

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

Page 22: בניית מחלקות

מה ההבדל בין הביטויים הבאים:

מה ההבדל בקוד?Point p1 = new Point ) (;p1.set )5,5(;Point p2 = new Point )(;p2.set )5,5(;Point p3 = p1;

א. כמה אובייקטים הגדרתי?ב. איזה מבין הביטויים הבאים יחזירו אמת

p1== p2p1 == p3

Page 23: בניית מחלקות

הצצה לזיכרון

Page 24: בניית מחלקות

equalsהגדרת שיטה

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

ערך כמו הערך השמור באופרנד השני.

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

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

בא לבדוק האם equals. מטרת הפעולה שקרהערכים השמורים במחלקה הם אותם ערכים.

Page 25: בניית מחלקות

equalsהוספת פעולת

אשר בודקת Equals נוסיף פעולה Timeאם נחזור למחלקה האם שני הזמנים שלפנינו זהים.

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((…

Page 26: בניית מחלקות

סיכום הפניות

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

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

פעולת == בודקת האם מדובר באותה אובייקט השמור בשני משתנים שונים

בודקת את תוכן האובייקט לראות האם הם equalsפעולה מכילים את אותם הערכים