2.3.3. החלק הדינאמי של אובייקט

נחלק את האובייקטים לשני סוגים:

  • אובייקטים פעילים: מנוהלים על ידי תהליך משלהם (thread). ייתכן שיהיה להם שינויי מצב ספונטניים.
  • אובייקטים פסיביים: משתנים רק כתוצאת מהפעלה על ידי אובייקטים אחרים. לקוח משתמש באובייקט המספק לו שירותים.

איך לקוח מתקשר עם העצמים השונים? הלקוח: מסוגל לשלוח הודעות לאובייקט כדי לקבל מידע על המצב שלו, או לבקש ממנו לשנות אותו. ללקוח אין גישה ישירה אל מאפייני האובייקט.

העברת הודעות: דרך התקשורת בין הלקוח אל האובייקט.

מינוח בשפת C++: מתודות והודעות מכונות function members בשפת C++.

הלקוח: יכול לשלוח הודעה. הודעה היא שם סימבולי + ארגומנטים במידת הצורך.

אובייקט: מפעיל מתודה בתגובה להודעה, יכול להחזיר במקרה הצורה תשובה ללקוח.

ההבדל בין הודעה לשיטה:

הודעה – פעולה מופשטת שאנחנו רוצים לבצע.

מתודה – המימוש של הפעולה.

דוגמא להודעה היא אפילו האופרטור +.

משתנים מסוגים שונים יתנהגו בצורה שונה כאשר נחבר ביניהם. יתר על כן – בשפת C++ ניתן לחפוף אופרטורים ולהגדיר אפילו עבור מחלקות שאנחנו כותבים את האופרטור, ובכך לראות בצורה טובה את ההבדל בין ההודעה "+" לפעולה, המתודה, המבוצעת בהתאם.

נגיד שולחים לאובייקט הודעה, אם איננו יודעים מאיזה סוג הוא, איננו יודעים (ולא מעניין אותנו) איזה מתודה תבוצע.

היכולת להפריד בין ההודעה למתודה מושג על ידי תכונת הפולימורפיזם בתכנות מונחה עצמים.



ניקח לדוגמא את האובייקט צורה ואת הפעולה סיבוב.

עבור צורה כללית, אם הזווית היא plot:$0^\circ $ לא נעשה כלום, ואחרת נסובב אותה בזווית המבוקשת.

עבור עיגול, עבור כל זווית אין צורך לבצע כל פעולה.

עבור מלבן, סיבוב ב-plot:$180^\circ $ או ב-plot:$360^\circ $ אינו מצריך פעולה.

כל אחד מהאובייקטים יגיב בצורה שונה להודעה "סובב את עצמך".

מאת: ניצן

Borland style vptr

לפי מה שאני מכיר:
"חסרון בגישה זו: גם כאשר איננו משתמשים ב-dynamic binding – אנחנו משלמים במקום"
לא נכון , עבור מחלקה A שאין לה מתודות דינמיות לא יווצר כלל המצביע, ולמשל עבור מחלקה B שיורשת מA פשוט נוסיף בהתחלה את המצביע, ואחרי הבלוק של A את שאר האינפורמציה של B . וככה לא משלמים על מה שלא משתמשים ועקרונות C++ נשמרים.
מה שכן באמת הcasting קצת יותר מסובך....
שיתוף:
| עוד