class<T> الفئات العامة

آخر تحديث: 2026-10-22

class<T> الفئات العامة

تربط الفئة العامة (class Stack<T>) «بنية الفئة» بنوع البيانات المخزنة: فنسخة Stack<number> لا يمر منها إلا number داخلًا وخارجًا. ويمكن للحقول ومعاملات الطرق وقيم إرجاع الطرق جميعها الإشارة إلى T، فتبقى الحالة كلها آمنة نوعيًا.

المجموعةالأنواع العامة
النوعبناء الجملة
الوضع الصارمغير مطلوب

ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.

📝 الصيغة

class Stack<T> {
  private items: T[] = [];
  push(item: T): void { this.items.push(item); }
  pop(): T | undefined { return this.items.pop(); }
  size(): number { return this.items.length; }
}

const numStack = new Stack<number>();

⚙️ المعاملات

<T>معامل النوع على مستوى الفئة: يُحدد عند new Stack<number>() ويُشترك فيه كل الفئة بنفس الـ T
pop(): T | undefinedقيمة الإرجاع تشير إلى T: فإخراج عنصر من المكدس الفارغ يعطي undefined، وهو معبَّر عنه بأمانة في النوع

القيمة المُعادة:تنثبّت أنواع إرجاع الطرق وفق T للنسخة: فـ pop() في Stack<number> هي number | undefined.

▶ مثال

عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:

الناتج:

2 1
build

(مخرجات التشغيل بعد التحويل؛ numStack.push("1") سيعطي خطأ ترجمة — فـ T لهذه النسخة مثبت على number)

💡 نقاط مهمة

ℹ️ معلومة T هو نفسه المتغير في كامل الفئة: ما تدفعه push هو ما تحصل عليه من pop — وهذا هو الاختلاف الجوهري بين الفئة العامة وحاوية any.
💡 تلميح الأعضاء الساكنون لا يمكنهم الإشارة إلى T الخاص بالفئة: فـ static على مستوى الفئة لا على مستوى النسخة؛ وإذا احتجت منطقًا عامًا ساكنًا فصرّح بمعاملات نوع خاصة لطريقة static.
⚠️ تنبيه معاملات النوع تعمل على جانب النسخة فقط: فـ Stack<number> و Stack<string> نوعان غير متوافقين، والإسناد بينهما يعطي خطأ.
المزيد من الحالات قادم قريبًا.

📚 دروس ذات صلة

❓ أسئلة شائعة

س هل يجوز كتابة new Stack() دون <number>؟
ج نعم، عندما تسمح معاملات المُنشئ بالاستدلال يُحدد T تلقائيًا (new Stack([1, 2]) ← Stack<number>)؛ أما المُنشئ الفارغ فلا يمكن الاستدلال منه وستحصل على Stack<unknown>، وفي هذه الحالة يُفضَّل الكتابة صراحةً.
س كيف تُكتب وراثة الفئة العامة؟
ج إما أن يثبّت الصنف الفرعي T: class NumberStack extends Stack<number>؛ أو أن يحمل معامل نوعه الخاص: class Box<T> extends Stack<T> — ويجب أن يتمكن معامل الصنف الفرعي من إرضاء معامل الفئة الأصل.
س هل التعاون بين الفئات العامة والواجهات العامة شائع؟
ج شائع جدًا: interface Repo<T> تعرّف العقد، و class MemoryRepo<T> implements Repo<T> توفر التنفيذ — يبقى العقد والتنفيذ معًا عامين فيحصل مستوى الأعمال على أنواع دقيقة.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%