abstract class الفئات المجردة
آخر تحديث: 2026-10-22
abstract class الفئات المجردة
الفئة المجردة (abstract class) «فئة أساس غير مكتملة»: يمكنها أن تحمل تنفيذًا فعليًا، وأن تصرح بأعضاء مجردة فقط (abstract area(): number) تلتزم الفئات الفرعية باستكمالها. لا يمكن إنشاء نسخ منها مباشرة، ولا تُستخدم إلا بالوراثة extends — وهي مناسبة للتعبير عن «كل الفئات الفرعية تتشارك الهيكل، والتفاصيل يخصص كلٌّ منها بنفسه».
| المجموعة | الدوال والأصناف |
|---|---|
| النوع | بناء الجملة |
| الوضع الصارم | غير مطلوب |
ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.
📝 الصيغة
abstract class Shape {
constructor(protected name: string) {}
abstract area(): number; // دالة مجردة: التوقيع فقط
describe(): string { // دالة ملموسة: تُورَّث كما هي
return `${this.name}: ${this.area().toFixed(2)}`;
}
}
class Circle extends Shape {
constructor(private radius: number) { super("circle"); }
area(): number { return Math.PI * this.radius ** 2; }
}
⚙️ المعاملات
| abstract class | الفئة المجردة: لا تُنشأ بـ new ولا تُستخدم إلا بالوراثة |
|---|---|
| abstract area(): number | العضو المجرد: توقيع فقط بلا تنفيذ، ويجب على الفئات الفرعية تنفيذه وإلا كان خطأ ترجمة |
| protected | غالبًا ما يُقرن بالفئات المجردة: حالة مثل name مخصصة «للفئات الفرعية» |
القيمة المُعادة:الطرق المجردة تُكتب التوقيع فقط؛ أما الطرق المحددة فعليها أنواع إرجاع طبيعية. ولا وجود لنسخ من الفئة المجردة، فكل الكائنات العاملة نسخ من الفئات الفرعية.
▶ مثال
عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:
الناتج:
circle: 3.14
square: 4.00
(مخرجات التشغيل بعد التحويل؛ new Shape("x") سيعطي خطأ ترجمة TS2511 — رغم أن الشيفرة JS بعد التحويل فئة عادية في الحقيقة)
💡 نقاط مهمة
ℹ️ معلومة التجريد أيضًا خاص بوقت الترجمة: يمنع tsc إجراء new Shape()، لكن الشيفرة JS بعد التحويل فئة عادية ولن يفشل new في وقت التشغيل — فهذا «ضمانة ضد الغفلة» لا «جدار رادع».
💡 تلميح الفئة المجردة مقابل الواجهة: الفئة المجردة قادرة على حمل الحالة والتنفيذ (جوهر نمط الطريقة القالبية)؛ أما الواجهة فتصف الشكل فقط. لمشاركة الكود استخدم فئة مجردة، وللتقييد على الشكل استخدم واجهة، ويمكن استخدام الاثنين معًا.
⚠️ تنبيه الفئة المجردة وراثة فردية فقط (extends لفئة واحدة)؛ وعند الحاجة إلى «قدرات متعددة» استخدم الواجهات مع التركيب، ولا تضغط سلسلة وراثة واحدة قسرًا.
🏷️ الدوال والأصناف ذات صلة
💡 حالات ذات صلة
المزيد من الحالات قادم قريبًا.
📚 دروس ذات صلة
❓ أسئلة شائعة
س ماذا يحدث عند إنشاء نسخة من فئة مجردة بـ new؟
ج خطأ ترجمة TS2511 (لا يمكن إنشاء نسخة من فئة مجردة). أما الشيفرة JS بعد التحويل ففئة عادية ولن يخطئ new في وقت التشغيل — فلا تعتمد على حماية وقت التشغيل.
س هل يمكن للفئة المجردة أن تملك مُنشئًا؟
ج نعم، وغالبًا ما يُقرن مع protected: فالمُنشئ المحدد بـ protected يمنع أيضًا الإنشاء بـ new من الخارج (مع سماح الفئات الفرعية بالاستدعاء super) — وهو تعبير آخر عن «منع التهيئة المباشرة».
س أيهما أختار: الفئة المجردة أم الواجهة؟
ج لمشاركة التنفيذ/الحالة (طريقة describe أو حقل name) ← الفئة المجردة؛ ولتعريف عقد فقط مع إمكانية أن تحققه فئة عدة عقود ← الواجهة. والتركيبة الشائعة: واجهة للعقد الخارجي، وفئة مجردة للتنفيذ الافتراضي.