170 likes | 471 Views
הנדסת תוכנה עם שפת C++. ד"ר רינה צביאל-גירשין הרצאה 5. מבט על על ההרצאה. הורשה מחלקה נגזרת שימוש בנאי מחלקת האב הרשאת גישה – protected. הורשה. הורשה inheritance היא אחד העקרונות של תכנות מונחה עצמים OOP . הורשה מרשה שימוש מחדש reuse של הקוד שנכתב.
E N D
הנדסת תוכנהעם שפת C++ ד"ר רינה צביאל-גירשין הרצאה 5
מבט על על ההרצאה • הורשה • מחלקה נגזרת • שימוש בנאי מחלקת האב • הרשאת גישה – protected Dr. Rina Zviel-Girshin
הורשה • הורשהinheritance היא אחד העקרונות של תכנות מונחה עצמים OOP. • הורשה מרשה שימוש מחדש reuse של הקוד שנכתב. • המחלקה החדשה שמייצרים נקראת מחלקה נגזרתderived class . • המחלקה הישנה נקראת מחלקת בסיסbase class. • שמות הנוספים • מחלקת בן – מחלקת אב. Dr. Rina Zviel-Girshin
דוגמה • נניח הגדרנו מחלקה עובד Employee. לכל עובד ישנם מאפיינים מסוימים: • תכונות - מס', שם, גיל, משכורת. • בנאים מתאימים, מתודות set get וכן מתודות נוספות כגון: חשב שכר. • נניח שאנחנו מעוניינים להגדיר מחלקה חדשה – מנהל Manager. למנהל יש: • תכונות - מס', שם, גיל, משכורת, רכב ובונוס. • בנאים מתאימים, מתודות set , get וכן מתודות נוספות כגון: חשב שכר, קביעת בונוס, העלאת שכר, שיפור רכב וכו'. • אם מסתכלים על שתי המחלקות מגלים שהרבה תכונות זהות, הרבה מתודות זהות. • לכן בכתיבה נקבל כפילויות בקוד. • כיצד ניתן למנוע זאת? • הורשה Dr. Rina Zviel-Girshin
דוגמה - המשך • למעשה מנהל הוא עובד. • הוא מקרה פרטי של עובד, יש לו את כל התכונות והמתודות של עובד ועוד תוספת (הרחבה). • יש כאן שתי מחלקות שיש ביניהן קשר של ירושה. הקשר שנקרא is-a • Manager is an Employee • מנהל הוא המחלקה הנגזרת ועובד הוא מחלקת בסיס. Dr. Rina Zviel-Girshin
מחלקה נגזרת • מחלקה נגזרת מקבל בהורשה את כל התכונות ומתודות של מחלקת בסיס • (all public data and methods) • תחביר: class DerivedClassName: <visibility modifier> BasicClassName { // declarations }; • דוגמה: class Manager : public Employee { … }; Dr. Rina Zviel-Girshin
Point ColoredPoint 3DColoredPoint דוגמה • מחלקה נגזרת מרחיבה את מחלקת בסיס. • מחלקה נגזרת עצמה יכולה להיות מחלקת בסיס למחלקה אחרת. • דוגמה: ColoredPointis aPoint with color, 3DColoredPointis aColoredPoint in 3D. Dr. Rina Zviel-Girshin
דוגמה #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
גישה לתכונות • מחלקת נגזרת יורשת ממחלקת בסיס את כל תכונותיה וכל יכולותיה. • אפילו פרטיים –private . • אבל לאיברים פרטיים אין גישה. • אז איך מאתחלים אותם? • דרך בנאי מחלקת בסיס • דרך מתודות של מחלקת בסיס Dr. Rina Zviel-Girshin
בנאי • בנאי של מחלקה נגזרת זהה לשם המחלקה. • לעדכון איברי מחלקת בסיס שקיבלנו בירושה ניתן להשתמש בבנאי של מחלקת בסיס. • תחביר קריאה לבנאי האב: :BaseClass(argument_list) • דוגמה: :Point(x,y) // a base class constructor 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
מה לא מקבלים בירושה? • מחלקה נגזרת מקבלת בירושה את כל האיברים של מחלקת בסיס חוץ מ- • בנאי constructor • מחסלdestructor • אותם יש להגדיר מחדש • אופרטור = • חברים 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); } • פעולה זו נקראת שרשור בנאים: • בהפעלת בנאי של הבן, קריאה לבנאי של האב כפעולה ראשונה. Dr. Rina Zviel-Girshin
מחסל • שימוש במחסל הוא בסדר הפוך • קודם כל מחסל מחלקת בן • אחר כך מחסל של מחלקת אב. 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
דוגמה 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
סיכום המלצה: אם אתם לא יודעים באילו הרשאות גישה לבחור - use protected visibility modifier (keep in mind that your class can be extended later). Dr. Rina Zviel-Girshin