בניית מחלקות
DESCRIPTION
בניית מחלקות. מה זה מחלקה?. מאפשר לנו "להרחיב" את שפת התכנות ולהגדיר סוגי נתונים חדשים. ברגע שאנו מגדירים "טיפוס" (מחלקה) חדשה, אנחנו יכולים ליצור מופעים מאותו סוג. לדוגמא : אם הגדרתי מחלקה מסוג מכונית ולייצור שני מופעים של מכוניות. מכונית 1. מכונית 2. מחלקת מכונית. - PowerPoint PPT PresentationTRANSCRIPT
בניית מחלקות
מה זה מחלקה?
מאפשר לנו "להרחיב" את שפת התכנות ולהגדיר סוגי נתונים חדשים.
ברגע שאנו מגדירים "טיפוס" )מחלקה( מאותו מופעיםחדשה, אנחנו יכולים ליצור
סוג. לדוגמא : אם הגדרתי מחלקה מסוג 1מכונית מכונית ולייצור שני מופעים של מכוניות
2מכונית
מחלקת מכונית
אני מעוניינת לכתוב תוכנית שיש בה מכוניות.
אני חייבת להחליט לשם מה אני שומרת את המכונית ולמה אני צריכה לדעת עליו
class Car{int yearDesign;
string name;
bool isManufacturedToday;
}
Car1:yearDesign:1915Name: Ford T-ModelisManufacturedToday : false
Car2:yearDesign:1938Name: Volkswagen beetleisManufacturedToday : true
מחלקת נקודה
יש הרבה יישומים אשר רוצים לתאר את המיקום על המשטח. לצורך כך נגדיר
Pointנקודה
class Point{int x;
int y;
}
עכשיו נוכל להגדיר נקודה באופן הבא:
Point p = new Point)(;
התנהגויות המחלקה
לא די לנו בלהגדיר מה האובייקט שלנו מכיל כלומר את לייצגאיזה נתונים אני חייב לשמור כדי מה המחלקה המחלקה, אני גם מעוניין לזהות
או מה הם התנהגויות שלנו יכולה לעשותהאובייקט שלנו.
: לדוגמאאנחנו יכולים לתת ערכים ראשוניים לנקודהאנחנו יכולים להזיז את הנקודה אנחנו יכולים לאחזר את נתוני הנקודה בפורמט
מסויים אנחנו יכולים לבדוק האם הנקודה שלנו זהה
לנקודה אחרת.
תיאור המחלקה באמצעות תרשים מחלקות
אם נרצה לייצג את מה שתיארנו כרגע במילים בצורה גראפית פשוטה וברורה
יותר, נוכל להיעזר בתרשים מחלקות
Point
+ x : int
+ y : int
+ Set )int, int ( : void
+ move )int, int( : void
+ ToString ) ( : String
+ Equals )Point( : boolean
שם המחלקה
מאפייני המחלקהattributes
שיטות המחלקהmethods
תרגום התרשים לקוד
נוכל להמיר את התרשים שלנו בקלות לקוד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;}
}
שימוש במחלקה שייצרנו
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”(;}
Timeתרגול נוסף – מחלקת
מייצג טיפוס זמן. אנחנו מעוניינים Timeמחלקת לנהל זמן המורכב מדקות ושניות.
פעולות שנוכל לעשות בזמן:עדכן זמןהצג דקותהצג שעות אחזר זמן בפורמטhh:mmהוסף דקות לזמןחשב הפרש בזמן
תרשים מחלקות
Timeתרשים מחלקות Time
+ hour : int
+ minutes: int
+ set )int, int(: void
+ getHours) ( : int
+ getMinutes ) (: int
+ toString) ( : String
+ addMinutes )int ( : void
+ difference )Time( : int
בעיות בארץ המחלקות!!!
אם ניקח את המחלקה שזה עתה יצרנו, נראה שיש לנו בעיה קטנה.
האם הפעולה הזאת נראית חוקית?Time t = new Time) (;t.hour = 26;t.minutes = 70;
קביעה האם זו חוקית נתונה פה לפרשנות.חוקית מבחינה המחשב, כן... ודאי. חוקית מ
מנגנון הרשאות הגישה
אחד מהיכולות של שפות מונחה עצמים הוא לקבוע מה רמת הרשאת הגישה לחלקים
(data members.של המחלקה ):public גישה מותרת לכולם – גם ממחלקות
אחרותprivate גישה מותרת רק לחברי המחלקה :
כלומר רק לקוד שנכתב בתוך המחלקה, privateאם נגדיר את המאפיינים שלנו כ-
אנחנו נמנע את הגישה הישירה ושינוי הנתונים ללא בקרה!
שימוש במנגנון הרשאות הגישה
שלנו באופן הבא:Timeכעת נגדיר את מחלקת ה-class Time{
private int hours;private int minutes;public void set )int hours, int minutes({…}}
אם נגדיר כעת במחלקה אחרתTime t = new Time)(;t.hours = 20; // פעולה לא חוקית!
גישה באמצעות השיטות
ובאמצעותו נפקח על השינויים 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;}
settersשימוש בשיטות gettersו-
התכונה הראשונה של תכנות עצמים נקראת .כימוס
, קופסא השחורההרחבת תכונה זו ויצירת תכונת הבאה להבטיח שהאובייקט שלנו יכיל רק נתונים
אמינים.
לא תהיה לנו גישה privateאם נשאיר את הכל (.get( ולא לצפיה )setלמחלקה, לא לשינוי )
כדי להבטיח שנוכל לצפות בנתוני המחלקה נגדיר שיבטיחו גישה אמינה לנתוני get ו- setשיטות
המחלקה
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”(;
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(;
}
סיכום
מושגים:אובייקט מחלקהמאפייניםשיטותכימוסקופסא שחורה שיטותsetters-ו getters
Referencesהפניות-
בגאווה יש שני סוגי נתונים: פרימיטיבים : שהם סוגי הנתונים שמובנים בתוך
וכו'int, long, boolean, float, charהשפה כמו: "מחלקות: אלו הטיפוסים החדשים ש"מתווספים
וכו'String, Point, Randomלשפה הבסיסי כמו: Java.מתיחס באופן שונה לשני סוגי הנתונים
בעוד שהמשתנים מסוג טיפוסים פרימיטיבים יושבים בזיכרון באיזור התוכנית, המשתנים
)האובייקטים( מסוג מחלקות יושבות באזור זיכרון הפניה( והמשתנה מכיל heap)הערימה הנקרא
לזיכרון היכן שמורים הנתונים
ארגון הזיכרון
מה ההבדל בין הביטויים הבאים:
מה ההבדל בקוד?Point p1 = new Point ) (;p1.set )5,5(;Point p2 = new Point )(;p2.set )5,5(;Point p3 = p1;
א. כמה אובייקטים הגדרתי?ב. איזה מבין הביטויים הבאים יחזירו אמת
p1== p2p1 == p3
הצצה לזיכרון
equalsהגדרת שיטה
כשאנחנו משתמשים באופרטור == אנחנו בודקים האם הערך השמור באופרנד הראשון מכיל אותו
ערך כמו הערך השמור באופרנד השני.
כאשר אנחנו עובדים עם מחלקות, הפעולה אינה האובייקט אלא הערך השמור תוכןבודקת את
דהיינו ההפניה! גם אם שני האובייקטים מכלים בדוייק את אותו הערך, עדיין הביטוי == יחזיר
בא לבדוק האם equals. מטרת הפעולה שקרהערכים השמורים במחלקה הם אותם ערכים.
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((…
סיכום הפניות
מושגים :טיפוס פרימיטיבי)טיפוס מסוג מחלקה )אובייקט)הפניה )כתובת(איזור זיכרון הערימהHeap)
שמירת אובייקטים נעשית באזור הזיכרון של הערימה ובמשתנה נשמר ההפניה לאזור הערימה.
פעולת == בודקת האם מדובר באותה אובייקט השמור בשני משתנים שונים
בודקת את תוכן האובייקט לראות האם הם equalsפעולה מכילים את אותם הערכים