الفرق بين Abstract Class و Interface
نعم، هناك فرق واضح بين الـ Abstract Class والـ Interface في البرمجة، وكل منهما يُستخدم لتحقيق أهداف مختلفة في تصميم البرامج.
في البداية، الـ Abstract Class هو نوع خاص من الكلاسات لا يمكن إنشاء كائن مباشر منها، بل يجب أن يتم اشتقاق كلاس آخر منها لتنفيذ بعض الوظائف. يتم استخدامه عندما نريد توفير قاعدة مشتركة تحتوي على بعض الوظائف المشتركة بين عدة كائنات، مع إمكانية ترك وظائف أخرى مجردة (أي بدون تنفيذ) لكي تنفذها الكلاسات الفرعية.
أما الـ Interface فهو عبارة عن عقد يحدد مجموعة من الدوال التي يجب أن تنفذها الكلاسات التي تعتمد هذا العقد. في كثير من لغات البرمجة، الـ Interface لا يحتوي على أي تنفيذ (خاصة قبل تطورات حديثة في بعض اللغات). ويُستخدم الـ Interface لتحديد سلوك مشترك بين كائنات مختلفة، بدون أن نلتزم بهياكل وراثية معينة.
الفرق الأساسي في الهيكل والوظيفة
الـ Abstract Class يمكن أن يحتوي على خصائص (متغيرات) ودوال منفذة وأخرى مجردة. يمكننا القول إنه بمثابة قالب يمكن للكلاسات الفرعية بناء عليه مع إمكانية مشاركة بعض الشيفرات. بينما الـ Interface يحتوي فقط على توقيعات الدوال (ماعدا بعض اللغات تسمح بوجود كود في الدوال الافتراضية)* أي إنه يوفر فقط ما يجب أن تُنفذ، وليس كيف تُنفذ.
أيضًا، في الوراثة، يمكن للكلاس أن يرث Abstract Class واحد فقط، بسبب قيود الوراثة الأحادية، بينما يمكنه أن يطبق عدة Interfaces في نفس الوقت، وهذا يجعل الـ Interface أداة ممتازة لتعزيز التعددية في السلوك.
استخدامات Abstract Class و Interface
يُفضل استخدام الـ Abstract Class عندما توجد علاقة “is-a” (أن يكون الكلاس نوعًا من النوع المجرد) مع رغبة في مشاركة بعض التنفيذ بين الكلاسات، مثل وجود بعض الوظائف الأساسية المشتركة. أما الـ Interface فيُستخدم لتحديد مجموعة من السلوكيات التي يجب أن تكون موجودة في كائنات قد تكون من أصل مختلف تمامًا، مثل “يمكن للطباعة” أو “يمكن المقارنة”.
نقاط مهمة يجب مراعاتها
1. الـ Abstract Class يسمح بوجود مُنشيء (Constructor) والخصائص مع قيم افتراضية، أما الـ Interface فهو لا يسمح بذلك عادةً.
2. التعديلات على واجهة الـ Interface تؤثر بشكل كبير لأنها قد تجعل كل الكلاسات التي تطبقها تحتاج إلى تعديل، أما Abstract Class يمكن تحديثه بمزيد من المرونة.
3. الـ Interface يعزز فصل الاهتمامات ويزيد من مرونة التصميم بسبب إمكانية دمجه مع عدة متطلبات دون تقييد الهيكل الهرمي.