C++/הורשה: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
Atavory (שיחה | תרומות)
אין תקציר עריכה
Atavory (שיחה | תרומות)
אין תקציר עריכה
שורה 1:
==הורשה==
{{בעבודה}}
 
מאפיין בסיסי של תכנות מונחה עצמים הוא מנגנון ההורשה, שמאפשר לנו לתת פתרון ספציפי לבעיה מסויימת מתוך פתרון גנרי קיים. למשל, נתונה לנו מחלקה המתארת אוגר שיודע לאכול ולישון, ומוגדרת בצורה הבאה:
הורשה
<source lang = "c++">
class Hamster
{
public:<br />
Hamster();
~Hamster();
void Eat();<br />
void Sleep();<br />
 
private:<br />
מאפיין בסיסי של תכנות מונחה עצמים הוא מנגנון ההורשה, שמאפשר לנו לתת פתרון ספציפי לבעיה מסויימת מתוך פתרון גנרי קיים. למשל, נתונה לנו מחלקה המתארת אוגר שיודע לאכול ולישון, ומוגדרת בצורה הבאה:
int teeth;<br />
<div style="direction: ltr;">
int colour;<br />
class CHamster<br />
};
{<br />
</source>
private:<br />
int teeth;<br />
int colour;<br />
public:<br />
CHamster();<br />
~CHamster();<br />
void Eat();<br />
void Sleep();<br />
}<br />
</div>
אנחנו מעוניינים ליצור מחלקה חדשה, המתארת אוגר קרב. אוגר קרב יודע לעשות כל מה שאוגר רגיל עושה, ובנוסף הוא יודע גם לתקוף אוגרים אחרים. עד עכשיו, היינו צריכים להגדיר מחלקת אוגר קרב נפרדת, דבר שגם כרוך בהמון עבודה, וגם דורש מאיתנו להעמיס את שיטת התקיפה, כדי לאפשר לאוגר הקרב לתקוף כל אוגר אחר, בין אם הוא אוגר קרב או לא. הגדרת מחלקת אוגר הקרב בלי מנגנון ההורשה תיראה בערך ככה:
<source lang = "c++">
<div style="direction: ltr;">
class CBattleHamster<br />BattleHamster
{
{<br />
private: <br />
int teeth;<br />
int colour;<br />
public:<br />
BattleHamster();
CBattleHamster();<br />
~BattleHamster()
~CBattleHamster()<br />
void Eat();<br />
void Sleep();<br />
void Attack(CHamsterHamster &pVictim);<br />
void Attack(CBattleHamsterBattleHamster &pVictim);<br />
}
}<br />
</divsource>
ברור שכתיבה כזאת תהיה מסורבלת מאוד, במיוחד בהתחשב בעובדה שאנחנו צריכים לממש כל שיטה מחדש מספר רב של פעמים. מנגנון ההורשה מאפשר לנו לקצר את התהליך ולהגדיר מחלקת אוגר קרב שהיא מקרה מיוחד של האוגר הרגיל שלנו. התחביר הוא כזה:
<div style="direction: ltr;">
class CBattleHamsterBattleHamster: CHamster<brpublic />Hamster
{
{<br />
public:<br />
void Attack(CHamsterHamster &pVictim);<br />
}
</div>
שורה 45 ⟵ 44:
בשפת C++ ניתן להרחיב את ההורשה ליותר ממחלקה אחת. לדוגמה, נגדיר מחלקת חיות סיביריות, שהמאפיין שלהם הוא היכולת להיכנס לתרדמת חורף. המחלקה תוגדר כך:
<div style="direction: ltr;">
class CSybirianAnimal<br />
{
{<br />
public:<br />
void Hibernate(); <br />
}
}<br />
</div>
כעת, אנחנו רוצים להגדיר אוגר קרב סיבירי, שהוא אוגר קרב וגם חיה סיבירית. אנחנו יכולים לרשת את מחלקת אוגר הקרב הסיבירי משתי המחלקות הקודמות שהגדרנו, מחלקת החיה הסיבירית ומחלקת אוגר הקרב, בצורה הבאה:
<div style="direction: ltr;">
class CSybirianBattleHamster: CBattleHamsterBattleHamster, CSybirianAnimal {};
</div>
באופן הזה יצרנו את מחלקת אוגר הקרב הסיבירי בשורת קוד אחת, וקיבלנו אוגר קרב שיודע לעשות גם את כל מה שחיה סיבירית יודעת לעשות.