2.3.3.2. סוגי פעולות (אופרטורים) על אובייקטים
- mutator – אופרטורים שהתפקיד שלהם הוא לשנות את
מצב האובייקט.
- inspector – אופטורים שהתפקיד שלהם
הוא לדווח על מצב העצם. Inspector מחזיר אובייקט שונה עם עותק של המידע הקיים
בעצם הנצפה.
- קיימת פונקציה המשנה מצב, וגם מחזירה
את הערך הקודם של האובייקט. פונקציה זו במקרים רבים היא יעילה יותר. מבחינת
הגישה, היא פחות בגישה של תכנות מונחה עצמים אבל שימוש בפונקציות כאלו לא
נחשב לרוב תכנות גרוע.
- constructor – הודעה שבד"כ לא
הולכת אל העצם אלא אל המחלקה. ההודעה מיועדת ליצור אובייקט חדש ולאתחל את
השדות שלו.
- destructor – מנקה את האובייקט
ומבצע פעולות סיום נוספות. הפעולה היא פעולה על העצם (לא על המחלקה).
- נשים לב שהעובדה ש-destructor זו הודעה לעצם ו-constructor זוהי הודעה לאובייקט, זוהי
הסיבה שבשפת C++ ה- destructor יכול להיות וירטואלי וה- constructorלא.
- revealer – נותנת גישה לחלקי האובייקט הפנימיים. למשל,
מחזירה משתנה התייחסות אל משתנה פנימי.
נציג דוגמא הכתובה בשפת C++.
הדוגמא לקוחה מהרצאות הטכניון בקורס "תכנות מונחה עצמים":
class Date {
public:
// Constructor
Date(int day = -1, int month = -1, int year = -1);
// Inspectors
int day(void) const { return d; }
int month(void) const { return m; }
int year(void) const { return y; }
// Mutators
int day(int day);
int month(int month);
int year(int year);
// Destructor
~Date(void) { cout << "Destructor Code Here" <<
endl; }
private:
int d;
int m;
int y;
};
השרטוט הבא מדגים את רכיבי הפרוטוקול
השונים הקיימים:
- Inspector עם 0 ארגומנטים – הפעולה נקבעת על פי שם
המתודה. למשל: GetName. Inspector עם 0 ארגומנטים זהו
ייצוג ל-read only attribute.
- באופן מקביל, mutator עם ארגומנט 1 מייצג write-only attribute.
שפות המציעות תכנות מונחה עצמים, צריכות
לאפשר הסתרת חלקים מהמימוש. כאשר שפה אינה מאפשרת להסתיר חלקים מהמימוש, זו בעייה
בקונספט של תכנות מונחה עצמים.
איננו רוצים בתכנות מונחה עצמים לאפשר
למשתמש גישה ישירה אל ה-data members.
עקרון ההתייחסות האחידה (The Principle of Uniform Reference) אומר שהתייחסות לאופציה כלשהי שמספק האובייקט לא
צריכה להיות שונה במקרה שמדובר במאפיין או בפעולה. ב-C++ דבר זה לא מתקיים. קיים הבדל
אם נקרא לפונקציה, למשל myClass.x() לבין אם ניגש לשדה myClass.x.
לפי עקרון הסתרת המימוש ב-OOP,
שדות נמצאים ב-C++ כ-private, ואנו מספקים פונקציות קטנות –
get ו-set לגישה אליהם. על מנת שלא לפגוע בביצועי התוכנית
בקריאה לפונקציות קטנות רבות הוכנסה המילה inline ל-C. שימוש בה מביא לשיפורים של
פי 25 לעומת תוכנית זהה שלא משתמשת בה!
Borland style vptr
לפי מה שאני מכיר:"חסרון בגישה זו: גם כאשר איננו משתמשים ב-dynamic binding – אנחנו משלמים במקום"
לא נכון , עבור מחלקה A שאין לה מתודות דינמיות לא יווצר כלל המצביע, ולמשל עבור מחלקה B שיורשת מA פשוט נוסיף בהתחלה את המצביע, ואחרי הבלוק של A את שאר האינפורמציה של B . וככה לא משלמים על מה שלא משתמשים ועקרונות C++ נשמרים.
מה שכן באמת הcasting קצת יותר מסובך....