עבור לתוכן

מחלקה שמכילה מחלקה אחרת. בעית עיצוב.

Featured Replies

פורסם

נתונה הבעיה:

יש מחלקה A:


class A{
public:
void doA();
private:
...
};

יש מחלקה אחרת B


class B{
public:
void doB();
private:
A _a;
};

כמו שניתן לראות היחס של A ו B הוא יחס של B has A

מילת המפתח פה היא has, כאמור אין אפשרות להישתמש בהורשה.

כמו כן המתשמש יכול ליצור רק מחלקות מסוג B

( A לא ניתן ליצור כי היא לא תעבוד בלי B). כמו כן המחלקה B אמורה לספק גישה למתודה doA של המחלקה A. איך ניתן לעצב את זה?

הרעיונות היחידים שעלו לי לראש הם:

1. להוסיף מתודה ל B שנרקראת const A& getA() const{return _a}

ואז לקרוא לה ככה b.getA().doA();

2. להוסיף ל B מתודה שנקראת void doAStuff(){ _a.doA();}

אבקש את עזרתכם בלבחור בעיצוב הנכון ביותר מבין השתיים או להמליץ על עיצוב אחר שאני כנראה לא מכיר שיכול לפתור את הבעיה הנ"ל.

תודה רבה מראש.

פורסם

B יכולה לרשת את A. ואז אתה יכול לעשות את A כמחלקה Pure Virtual

במצב כזה אי אפשר ליצור אובייקטים מסוג A, ותוכל להשתמש במתודה doA דרך אוביקט מסוג B.

נראה לי הדרך הכי נכונה.

פורסם
  • מחבר

B לא יכול לרשת מ A מסיבה הפשוטה שזה לא נכון, תתיחס אל B כאל מכונית ואל A כאל גלגלים. מכונית היא לא סוג של גלגלים ולכן היחס פה הוא has-a

תודה בכל מקרה.

פורסם

לפעמים אפשר להשתמש ב-private inheritance אשר הרבה פעמים אומר implemented-in-terms-of ויש דמיון בינו לבין הכלה (aggregation או composition).

בגדול, כאשר זה אפשרי, עדיף לרוב להשתמש בהכלה מאשר בירושה פרטית.

מומלץ בחום:

http://www.parashift.com/c++-faq-lite/private-inheritance.html

פורסם
  • מחבר

הבנתי תודה רבה.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים