0 تصويتات
منذ في تصنيف البرمجة بواسطة admin6 (302ألف نقاط)
ما الفرق بين Abstract Class و Interface؟

1 إجابة واحدة

0 تصويتات
منذ بواسطة admin6 (302ألف نقاط)

الفرق بين Abstract Class و Interface في البرمجة

الفرق الأساسي بين Abstract Class و Interface يكمن في كيفية تعريفهما واستخدامهما لتنظيم الكود وإجبار الكائنات على تنفيذ وظائف معينة في البرمجة الكائنية التوجه (OOP). كلاهما يستخدمان لتحقيق مفهوم التجريد (Abstraction)، لكنهما يخدمان أغراضاً مختلفة ولهما قيود وآليات خاصة.

ما هو Abstract Class؟


الـ Abstract Class هو فئة (Class) يمكن تعريفها كهيكل عام يحتوي على بعض الوظائف أو الخصائص المشتركة التي يراد أن تشترك بها فئات أخرى. يمكن للـ Abstract Class أن تحتوي على طرق (Methods) معرفة بالكامل أو مجردة (Abstract Methods) بدون تنفيذ، مما يجبر الفئات المشتقة منها على تنفيذ هذه الطرق المجردة.

ميزة الـ Abstract Class هي أنه يمكن أن يحتوي على بيانات (متغيرات) وحالات, وممكن أن يحتوي على تنفيذ جزئي لطريقة معينة، وبالتالي يمكن إعادة استخدام الكود المشترك بين الفئات التي ترث منه. الـ Abstract Class لا يمكن إنشاء كائن مباشر منها (أي لا يمكن عمل instance منها)، وإنما فقط يمكن إنشاء كائن من الفئات التي ترث منها وتكمل تنفيذ الطرق المجردة.

ما هو Interface؟


الـ Interface هو عقد أو اتفاقية تحدد مجموعة من الوظائف (طرق) التي يجب أن تنفذها أي فئة تصف هكذا واجهة. لا يحتوي الـ Interface على تنفيذ داخلي لأي طريقة، بل فقط يعلن عنها بشكل مجرد. أي فئة تقوم بتنفيذ (Implement) هذا الـ Interface يجب أن توفر تنفيذ كامل لكل الطرق المعروفة ضمنه.

الهدف من الـ Interface هو توفير قاعدة محددة للتفاعل والتواصل بين الكائنات، وهو يستخدم بشكل كبير لتحقيق تعدد الأشكال (Polymorphism)، حيث يمكن لفئات مختلفة تنفيذ نفس الواجهة بطرق مختلفة.

الاختلافات الرئيسية بين Abstract Class و Interface


1. الوراثة والهيكل: يمكن للفئة أن ترث Abstract Class واحدة فقط بسبب الوراثة الأحادية، بينما يمكن تنفيذ (implement) عدة Interfaces في نفس الوقت، ما يتيح مرونة أكبر عند استخدام الواجهات.

2. التنفيذ: Abstract Class يمكن أن يحتوي على طرق كاملة التنفيذ وبيانات (خصائص)، أما Interface فلا يحتوي سوى على تعريف الوظائف بدون تنفيذ (في معظم لغات البرمجة الحديثة، مثل Java 8 وما بعدها، يمكن لـ Interface أن يحتوي على طرق افتراضية محددة مسبقاً لكن هذا استثناء).

3. استخدام الحالة: إذا كانت هناك وظائف مشتركة تحتاج إلى تنفيذ مشترك في فئات مختلفة، من الأفضل استخدام Abstract Class. أما إذا كان الهدف هو فرض تطبيق مجموعة من الوظائف المختلفة عبر فئات غير مترابطة، فالـ Interface هو الخيار الأنسب.

4. المرونة والتعدد: يمكن أن تنفذ الفئة عدة Interfaces ولا ترث إلا Abstract Class واحد فقط.

مثال عملي لتوضيح الفرق


تخيل أنك تطور برنامج لإدارة الحيوانات. يمكنك إنشاء Abstract Class باسم "حيوان" يحتوي على خصائص مثل "العمر" و"الوزن"، وطريقة مثل "التنفس" التي يتم تعريفها مشتركًا. لكن واجهة (Interface) قد تكون "يمكن الطيران" تحتوي على طريقة مجردة "طار" يجب على جميع الفئات التي تطبق هذه الواجهة تنفيذها.

في هذه الحالة، جميع الحيوانات سترث الخصائص العامة وسلوكيات التنفس من Abstract Class "حيوان"، بينما الفئات التي تستطيع الطيران مثل "الطائر" أو "الخفاش" ستنفذ الـ Interface "يمكن الطيران" لتنفيذ الوظيفة المحددة.

...