تكرار السؤال: …
الإجابة المختصرة
الفئة المجردة تمثل هوية جزئية مشتركة ('is-a') ويمكنها الاحتفاظ بحالة (State) وتنفيذ افتراضي للدوال، بينما الواجهة تمثل عقداً سلوكياً ('can-do') يحدد ماذا تفعل الكائنات دون احتفاظ بحالة الفئة.
الشرح
تُستخدم Abstract Classes عندما تشترك عدة فئات في كود تنفيذي مشترك وحالة محددة (Protected fields)، وتكون هناك علاقة وراثية عميقة. أما الواجهات (Interfaces) فتُستخدم لفصل واجهة الاستخدام تماماً عن التنفيذ وتحقيق فك الارتباط الكامل (Decoupling) وتمكين الاختبارات وعزل التبعيات.
مثال بالكود
abstract class Animal {
constructor(public name: string) {} // تحتفظ بحالة
abstract makeSound(): void;
sleep() { console.log('Zzz...'); } // تنفيذ مشترك
}
interface Flyable {
fly(): void; // عقد سلوكي بحت
}أخطاء شائعة
- استخدام الفئات المجردة فقط كعقود فارغة دون أي كود مشترك بدلاً من استخدام الواجهات الأبسط والأخف.