الدرس 9: Generics وvariance
بدون generics تتكرر كل بنية بيانات: AppleBasket وOrangeBasket — أو الأسوأ، سلة من object مع تحويلات خطيرة في زمن التشغيل. في هذا الدرس نكتب صنفًا واحدًا بمعامل نوع <T>، ونتعلّم متى تسمح out وin بوضع سلة تفاح في مكان يُتوقَّع فيه سلة فاكهة.
الـ generics مثل قالب خَبز واحد يُملأ في كل مرة بعجينة مختلفة — القالب لا يتغيّر أبدًا، بل المحتوى فقط. وقاعدة الأمان بسيطة: إخراج "فاكهة" من صندوق تفاح آمن، أمّا رمي بطيخة داخله فليس كذلك.
- Generics وvariance
- معاملات النوع تتيح لصنف أو واجهة واحدة أن تخدم كل نوع بأمان؛ والـ variance (out/in) تقرّر متى يجوز لنوع فرعي أن يحلّ محلّ نوع أساسي.
- معامل النوع <T>
- نوع نائب يملؤه الكود المُستدعي — Basket<Apple>، Basket<string> — يفرضه المُصرِّف في زمن التصريف، دون تحويلات.
- التغاير المشترك (out)
- حين يظهر T كمُخرَج فقط، يُسمح باستخدام IProducer<Apple> بوصفها IProducer<Fruit> — كل ما يخرج هو فاكهة. أمّا الاتجاه المعاكس، in، فيغطّي T الذي يدخل فقط.