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