Transcript lect5_08

‫הנדסת תוכנה‬
‫עם שפת ‪C++‬‬
‫ד"ר רינה צביאל‪-‬גירשין‬
‫הרצאה ‪5‬‬
‫מבט על על ההרצאה‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪2‬‬
‫הורשה‬
‫מחלקה נגזרת‬
‫שימוש בנאי מחלקת האב‬
‫הרשאת גישה – ‪protected‬‬
‫‪Dr. Rina Zviel-Girshin‬‬
‫הורשה‬
‫הורשה ‪ inheritance‬היא אחד העקרונות של תכנות מונחה‬
‫עצמים ‪.OOP‬‬
‫‪‬‬
‫הורשה מרשה שימוש מחדש ‪ reuse‬של הקוד שנכתב‪.‬‬
‫‪‬‬
‫המחלקה החדשה שמייצרים נקראת מחלקה נגזרת ‪derived‬‬
‫‪.class‬‬
‫המחלקה הישנה נקראת מחלקת בסיס ‪.base class‬‬
‫שמות הנוספים‬
‫‪ ‬מחלקת בן – מחלקת אב‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪3‬‬
‫‪Dr. Rina Zviel-Girshin‬‬
‫דוגמה‬
‫נניח הגדרנו מחלקה עובד ‪ .Employee‬לכל עובד ישנם מאפיינים מסוימים‪:‬‬
‫‪ ‬תכונות ‪ -‬מס'‪ ,‬שם‪ ,‬גיל‪ ,‬משכורת‪.‬‬
‫‪ ‬בנאים מתאימים‪ ,‬מתודות ‪ set get‬וכן מתודות נוספות כגון‪ :‬חשב שכר‪.‬‬
‫‪‬‬
‫נניח שאנחנו מעוניינים להגדיר מחלקה חדשה – מנהל ‪ .Manager‬למנהל יש‪:‬‬
‫‪ ‬תכונות ‪ -‬מס'‪ ,‬שם‪ ,‬גיל‪ ,‬משכורת‪ ,‬רכב ובונוס‪.‬‬
‫‪ ‬בנאים מתאימים‪ ,‬מתודות ‪ get ,set‬וכן מתודות נוספות כגון‪ :‬חשב שכר‪ ,‬קביעת‬
‫בונוס‪ ,‬העלאת שכר‪ ,‬שיפור רכב וכו'‪.‬‬
‫‪‬‬
‫‪‬‬
‫אם מסתכלים על שתי המחלקות מגלים שהרבה תכונות זהות‪ ,‬הרבה מתודות זהות‪.‬‬
‫לכן בכתיבה נקבל כפילויות בקוד‪.‬‬
‫‪‬‬
‫כיצד ניתן למנוע זאת?‬
‫‪ ‬הורשה‬
‫‪‬‬
‫‪4‬‬
‫‪Dr. Rina Zviel-Girshin‬‬
‫דוגמה ‪ -‬המשך‬
‫‪‬‬
‫למעשה מנהל הוא עובד‪.‬‬
‫הוא מקרה פרטי של עובד‪ ,‬יש לו את כל התכונות והמתודות‬
‫של עובד ועוד תוספת (הרחבה)‪.‬‬
‫‪‬‬
‫יש כאן שתי מחלקות שיש ביניהן קשר של ירושה‪ .‬הקשר‬
‫שנקרא ‪is-a‬‬
‫‪Manager is an Employee‬‬
‫מנהל הוא המחלקה הנגזרת ועובד הוא מחלקת בסיס‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪5‬‬
‫‪Dr. Rina Zviel-Girshin‬‬
‫‪‬‬
‫מחלקה נגזרת‬
‫מחלקה נגזרת מקבל בהורשה את כל התכונות ומתודות של מחלקת בסיס‬
(all public data and methods) 

:‫תחביר‬

:‫דוגמה‬

class DerivedClassName: <visibility modifier> BasicClassName
{
// declarations
};
class Manager : public Employee
{…
};
Dr. Rina Zviel-Girshin
6
‫דוגמה‬
Point
ColoredPoint
3DColoredPoint
.‫מחלקה נגזרת מרחיבה את מחלקת בסיס‬
‫מחלקה נגזרת עצמה יכולה להיות מחלקת‬
.‫בסיס למחלקה אחרת‬
:‫דוגמה‬



ColoredPoint is a Point with color,
3DColoredPoint is a ColoredPoint in 3D.
Dr. Rina Zviel-Girshin
7
#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
};
//constructor
ColoredPoint::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);}
Dr. Rina Zviel-Girshin
8
‫גישה לתכונות‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪9‬‬
‫מחלקת נגזרת יורשת ממחלקת בסיס את כל תכונותיה‬
‫וכל יכולותיה‪.‬‬
‫אפילו פרטיים –‪. private‬‬
‫אבל לאיברים פרטיים אין גישה‪.‬‬
‫אז איך מאתחלים אותם?‬
‫‪ ‬דרך בנאי מחלקת בסיס‬
‫‪ ‬דרך מתודות של מחלקת בסיס‬
‫‪Dr. Rina Zviel-Girshin‬‬
‫בנאי‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫בנאי של מחלקה נגזרת זהה לשם המחלקה‪.‬‬
‫לעדכון איברי מחלקת בסיס שקיבלנו בירושה ניתן‬
‫להשתמש בבנאי של מחלקת בסיס‪.‬‬
‫תחביר קריאה לבנאי האב‪:‬‬
‫)‪:BaseClass(argument_list‬‬
‫‪‬‬
‫דוגמה‪:‬‬
‫‪:Point(x,y) // a base class constructor‬‬
‫‪10‬‬
‫‪Dr. Rina Zviel-Girshin‬‬
‫קריאה למתודות של מחלקת בסיס‬
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);
}
‫במחלקה נגזרת ניתן‬
‫להשתמש במתודות מחלקת‬
.‫בסיס‬
:‫תחביר‬


BaseClass::method(argument_list);
:‫דוגמה‬
update ‫נניח שהוספנו מתודה‬
. ColoredPoint ‫למחלקה‬
Dr. Rina Zviel-Girshin


11
‫מה לא מקבלים בירושה?‬
‫‪‬‬
‫מחלקה נגזרת מקבלת בירושה את כל האיברים של‬
‫מחלקת בסיס חוץ מ‪-‬‬
‫‪ ‬בנאי ‪constructor‬‬
‫‪ ‬מחסל ‪destructor‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪12‬‬
‫אותם יש להגדיר מחדש‬
‫אופרטור =‬
‫חברים ‪friends‬‬
‫‪Dr. Rina Zviel-Girshin‬‬
‫בנאי האב‬
‫בבניית עצם ממחלקת בן‪ ,‬באופן אוטומאטי מתבצעת קריאה לבנאי ברירת המחדל‬
‫של מחלקת האב‪.‬‬
‫‪‬‬
‫‪‬‬
‫קריאה לבנאי האב מתבצעת בשורה ראשונה של הקוד‬
‫‪ ‬בצורה מחייבת )‪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‬‬
‫}‬
‫פעולה זו נקראת שרשור בנאים‪:‬‬
‫‪ ‬בהפעלת בנאי של הבן‪ ,‬קריאה לבנאי של האב כפעולה ראשונה‪.‬‬
‫‪‬‬
‫‪13‬‬
‫‪Dr. Rina Zviel-Girshin‬‬
‫מחסל‬
‫‪‬‬
‫‪14‬‬
‫שימוש במחסל הוא בסדר הפוך‬
‫‪ ‬קודם כל מחסל מחלקת בן‬
‫‪ ‬אחר כך מחסל של מחלקת אב‪.‬‬
‫‪Dr. Rina Zviel-Girshin‬‬
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.
Dr. Rina Zviel-Girshin


15
‫דוגמה‬
class A
{
protected:
int x;
};
class B: public A
{
int y;
public:
B(int ax, int by)
{x=ax; y=by;}
};
Dr. Rina Zviel-Girshin
16
‫סיכום‬
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).
Dr. Rina Zviel-Girshin
17