מה ההבדל בין Abstract לבין Interface?

היי,

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

ובכן, מה זה interface / אינטרפייס?

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

interface Walk {
    public function walking();
}

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

class Person implements Walk {
    public function walking(){
        return "I am walking";
    }
}

מה שעשינו כאן בעצם זה התחייבנו, באמצעות המילה Implements לעמוד בהסכם עם הממשק Walk! ואכן- עמדנו בהסכם כאשר מימשנו את המתודה. כמובן שניתן לממש את המתודה בכל מחלקה בצורה אחרת:

class Dog implements Walk {
    public function walking()
    {
        return "I am walking and I can run!";
    }
}

אחרי שהבנו כרגע מהו אינטרפייס / Interface ב PHP , נלמד מהי מחלקה אבסטרקטית.

מחלקה אבסטרקטית / Abstract ב- PHP ובכלל…

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

abstract class Animal
{
    public $name;
    public $age;
    
    public function Describe()
    {
        return $this->name . ", " . $this->age . " years old";    
    }
    
    abstract public function Greet();
}

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

class Dog extends Animal {}

וזאת מפני שלא מימשנו את המתודות שהוגדרו במחלקה האבסטרקטית Animal. וזהו הקוד התקין הממש את המתודות:

class Dog extends Animal
{
    public function Greet()
    {
        return "Woof!";    
    }
    
    public function Describe()
    {
        return parent::Describe() . ", and I'm a dog!";    
    }
}
$animal = new Dog();
$animal->name = "Mandi";
$animal->age = 10;
echo $animal->Describe();
echo $animal->Greet();

ובכן, אחרי שהסברנו על רגל אחת מהי מחלקה אבסטרקטית ומהו אינטרפייס…

ההבדל בין מחלקה אבסטרקטית לבין אינטרפייס

ראשית כל- גם במחלקה אבסטרקטית וגם באינטרפייס אנו מחייבים את המחלקה המממשת או היורשת לכלול מתודות מסויימות.

  1. מחלקה יכולה לירוש ממחלקה אחת בלבד! לעומת זאת- אין הגבלה במימוש אינטרפייסים מרובים.
  2. בשונה מאינטרפייס – במחלקה אבסטרקטית ניתן לרשום קוד, לתת גוף למתודה. הקוד כמובן עובר בהורשה.

(3159)

הגב לכתבה דרך הפייסבוק:

5 תגובות למאמר זה

נהנים מהתכנים? מילה טובה תעודד אותי להמשיך לכתוב

האימייל לא יוצג באתר. שדות החובה מסומנים *