17
ההההה ההההה הה הההC++ הההההה- ה"ה הההה ההההה ההההה5

הנדסת תוכנה עם שפת C++

  • Upload
    xiang

  • View
    67

  • Download
    0

Embed Size (px)

DESCRIPTION

הנדסת תוכנה עם שפת C++. ד"ר רינה צביאל-גירשין הרצאה 5. מבט על על ההרצאה. הורשה מחלקה נגזרת שימוש בנאי מחלקת האב הרשאת גישה – protected. הורשה. הורשה inheritance היא אחד העקרונות של תכנות מונחה עצמים OOP . הורשה מרשה שימוש מחדש reuse של הקוד שנכתב. - PowerPoint PPT Presentation

Citation preview

Page 1: הנדסת תוכנה עם שפת  C++

הנדסת תוכנה++C עם שפת

ד"ר רינה צביאל-גירשין5הרצאה

Page 2: הנדסת תוכנה עם שפת  C++

Dr. Rina Zviel-Girshin 2

מבט על על ההרצאה

הורשהמחלקה נגזרתשימוש בנאי מחלקת האב – הרשאת גישהprotected

Page 3: הנדסת תוכנה עם שפת  C++

Dr. Rina Zviel-Girshin 3

הורשה

הורשהinheritance היא אחד העקרונות של תכנות .OOPמונחה עצמים

הורשה מרשה שימוש מחדשreuse.של הקוד שנכתב

מחלקה המחלקה החדשה שמייצרים נקראת. derived classנגזרת

מחלקת בסיסהמחלקה הישנה נקראת base class. שמות הנוספים

.מחלקת בן – מחלקת אב

Page 4: הנדסת תוכנה עם שפת  C++

Dr. Rina Zviel-Girshin 4

דוגמה

נניח הגדרנו מחלקה עובדEmployee :לכל עובד ישנם מאפיינים מסוימים . .תכונות - מס', שם, גיל, משכורת בנאים מתאימים, מתודותset get.וכן מתודות נוספות כגון: חשב שכר

נניח שאנחנו מעוניינים להגדיר מחלקה חדשה – מנהלManager:למנהל יש . .תכונות - מס', שם, גיל, משכורת, רכב ובונוס בנאים מתאימים, מתודותset , get ,וכן מתודות נוספות כגון: חשב שכר

קביעת בונוס, העלאת שכר, שיפור רכב וכו'.

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

.לכן בכתיבה נקבל כפילויות בקוד

?כיצד ניתן למנוע זאתהורשה

Page 5: הנדסת תוכנה עם שפת  C++

Dr. Rina Zviel-Girshin 5

דוגמה - המשך

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

והמתודות של עובד ועוד תוספת )הרחבה(.

.יש כאן שתי מחלקות שיש ביניהן קשר של ירושה is-aהקשר שנקרא

Manager is an Employee מנהל הוא המחלקה הנגזרת ועובד הוא מחלקת

בסיס.

Page 6: הנדסת תוכנה עם שפת  C++

Dr. Rina Zviel-Girshin 6

מחלקה נגזרת

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

(all public data and methods)

:תחבירclass DerivedClassName: <visibility modifier> BasicClassName{// declarations};

:דוגמהclass Manager : public Employee… {;}

Page 7: הנדסת תוכנה עם שפת  C++

Dr. Rina Zviel-Girshin 7

דוגמה

מחלקה נגזרת מרחיבה את מחלקתבסיס.

מחלקה נגזרת עצמה יכולה להיותמחלקת בסיס למחלקה אחרת.

:דוגמהColoredPoint is a Point with color,

3DColoredPoint is a ColoredPoint in 3D.

Point

ColoredPoint

3DColoredPoint

Page 8: הנדסת תוכנה עם שפת  C++

Dr. Rina Zviel-Girshin 8

דוגמה#include ”point.h”

class ColoredPoint: public Point}

char *color;//int x,y are inherited from Point class

public:ColoredPoint(int x, int y, char *color);void setColor(char *newcolor);

char* getColor();// int getX() is inherited from Point class// int getY() is inherited from Point class

// void setX(int x) is inherited from Point class // void setY(int y) is inherited from Point class{;

//constructorColoredPoint::ColoredPoint(int x,int y,char *color):Point(x,y) // call base class constructor}

this->color=strdup(color);{

char* ColoredPoint::getColor()

} return this->color;{

void ColoredPoint::setColor(char *newcolor)

} strcpy(color,newcolor);{

Page 9: הנדסת תוכנה עם שפת  C++

Dr. Rina Zviel-Girshin 9

גישה לתכונות

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

– אפילו פרטייםprivate. .אבל לאיברים פרטיים אין גישה?אז איך מאתחלים אותם

דרך בנאי מחלקת בסיסדרך מתודות של מחלקת בסיס

Page 10: הנדסת תוכנה עם שפת  C++

Dr. Rina Zviel-Girshin 10

בנאי

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

להשתמש בבנאי של מחלקת בסיס.:תחביר קריאה לבנאי האב

:BaseClass(argument_list):דוגמה

:Point(x,y) // a base class constructor

Page 11: הנדסת תוכנה עם שפת  C++

Dr. Rina Zviel-Girshin 11

קריאה למתודות של מחלקת בסיס

במחלקה נגזרת ניתןלהשתמש במתודות

מחלקת בסיס.:תחביר

BaseClass::method(argument_list);

:דוגמה נניח שהוספנו מתודה

update למחלקה ColoredPoint .

class ColoredPoint: public Point

{

char *color;

public:

void update(int x, int y, char *color);

};

void ColoredPoint::update(int x, int y, char *color)

{

Point::setX(x); //call base class setX method

Point::setY(y); //call base class setY method

this->color=strdup(color);

}

Page 12: הנדסת תוכנה עם שפת  C++

Dr. Rina Zviel-Girshin 12

מה לא מקבלים בירושה?

מחלקה נגזרת מקבלת בירושה את כל האיבריםשל מחלקת בסיס חוץ מ-

בנאיconstructorמחסלdestructor

אותם יש להגדיר מחדש= אופרטור חבריםfriends

Page 13: הנדסת תוכנה עם שפת  C++

Dr. Rina Zviel-Girshin 13

בנאי האב בבניית עצם ממחלקת בן, באופן אוטומאטי מתבצעת קריאה לבנאי

ברירת המחדל של מחלקת האב. מתבצעת בשורה ראשונה של הקודלבנאי האבקריאה

בצורה מחייבתBaseClass(argument_list) - או בצורה מרומזתdefault constructor (constructor with no arguments) :דוגמה

ColoredPoint::ColoredPoint(int x,int y,char *color):Point(x,y) // call base class constructor}

this->color=strdup(color);{

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

Page 14: הנדסת תוכנה עם שפת  C++

Dr. Rina Zviel-Girshin 14

מחסל

הוא בסדר הפוך במחסלשימוש קודם כל מחסל מחלקת בן .אחר כך מחסל של מחלקת אב

Page 15: הנדסת תוכנה עם שפת  C++

Dr. Rina Zviel-Girshin 15

protected

קיימת הרשאת גישה מוגנתprotected.:תחביר

protected: type variableName; protected: type methodName(arg_list);

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

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

Protected members of the base class can be used by other members of the derived class.

Page 16: הנדסת תוכנה עם שפת  C++

Dr. Rina Zviel-Girshin 16

דוגמהclass A}protected:

int x;{;

class B: public A}

int y;public: B(int ax, int by)

}x=ax; y=by;{{;

Page 17: הנדסת תוכנה עם שפת  C++

Dr. Rina Zviel-Girshin 17

סיכום

Access public protected private

members of the same class yes yes yes

members of derived classes yes yes no

not-members yes no no

:המלצה

- אם אתם לא יודעים באילו הרשאות גישה לבחורuse protected visibility modifier (keep in mind that your class can be extended later).