C++/הורשה

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי
< C++


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

class Hamster
{
public:
  Hamster();
  ~Hamster();
  void Eat();
  void Sleep();

private:
  int teeth;
  int colour;
};

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

class BattleHamster
{
  int teeth;
  int colour;
public:
  BattleHamster();
  ~BattleHamster()
  void Eat();
  void Sleep();
  void Attack(Hamster &pVictim);
  void Attack(BattleHamster &pVictim);
}

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

class BattleHamster: public Hamster
{
public:
void Attack(Hamster &pVictim);
}

אוגר הקרב החדש שלנו קיבל בירושה את כל התכונות של האוגר הרגיל, והוסיף להן תכונה חדשה משלו. מכאן אנחנו יכולים להגיד שאוגר קרב הוא סוג של אוגר, שמסוגל לתקוף. מילת המפתח בהורשה היא "סוג של", או "is a", מכיוון שמחלקה יורשת היא מצב מיוחד של המחלקה המורישה, כמו האוגר ואוגר הקרב. בשפת CPP ניתן להרחיב את ההורשה ליותר ממחלקה אחת. לדוגמה, נגדיר מחלקת חיות סיביריות, שהמאפיין שלהם הוא היכולת להיכנס לתרדמת חורף. המחלקה תוגדר כך:

class SybirianAnimal
{
public:
void Hibernate(); 
}

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

class SybirianBattleHamster: BattleHamster, SybirianAnimal {};

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


הפרק הקודם:
מחלקות
הורשה הפרק הבא:
העמסת אופרטורים