English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
يسمح تنسيق النسخ والتناقض لنا بالتعامل مع هيكل الفئة بطريقة أكثر مرونة.
قبل أن نتعلم عن تنسيق النسخ والتناقض، دعونا نرى هيكل الفئة التالي:
public class Small { } public class Big: Small { } public class Bigger : Big { }
وفقًا للنوع المثال أعلاه، هو نوع أساسي لـ Big، وBig هو نوع أساسي للـ Bigger. يجب أن نتذكر أن النوع الممتد سيكون دائمًا لديه المزيد من الأشياء مقارنة بالنوع الأساسي، لذا تكون الفئة الأساسية أصغر من النوع الممتد.
الآن، لننظر في التهيئة التالية:
كما هو موضح أعلاه، يمكن للنوع الأساسي استيعاب النوع الممتد، ولكن النوع الممتد لا يمكنه استيعاب النوع الأساسي. بمعنى آخر، يمكن قبول مثيل حتى لو كان صغيرًا، ولكن لا يمكن قبول مثيل كبير إذا كان يتطلب كبيرًا.
الآن، دعونا نتعرف على تنسيق النسخ والتناقض.
تنسيق النسخ يتيح لك نقل أنواع النسخ، حيث تحتاج إلى نوع الأساس. تنسيق النسخ يشبه التباين في نفس النوع. يتم اعتبار الكلاسات الأساسية والنوع الممتد ككلاسات متشابهة تعمل على إضافة ميزات إضافية إلى النوع الأساسي. لذلك، يسمح تنسيق النسخ لك استخدام النوع الممتد حيث تحتاج إلى النوع الأساسي (إذا كنت بحاجة إلى النوع الأصغر، فإن rule: يمكن قبول النوع الأكبر).
تنسيق النسخ يمكن تطبيقه على الممثل، الم générique، المصفوفات، الاجهزة، وما إلى ذلك.
تنسيق النسخ في الممثل يتيح للممثل أن يكون نوعاً مروناً في نوع العائد.
public delegate Small covarDel(Big mc); public class Program { public static Big Method1(Big bg) { Console.WriteLine("Method1"); return new Big(); } public static Small Method2(Big bg) { Console.WriteLine("Method2"); return new Small(); } public static void Main(string[] args) { covarDel del = Method1; Small sm1 = del(new Big()); del = Method2; Small sm2 = del(new Big()); } }
Method1 Method2
كما ترونه في المثال السابق، يتوقع المندوب نوع إرجاع Small (النوع الأساسي)، ولكن يمكننا أيضًا تخصيص Method1 الذي يرجع Big (النوع المشتق) و Method2 التي تحتوي على نفس التوقيع كما يتوقعها المندوب.
لذلك، يسمح التباين بتخصيص الطريقة إلى المندوب الذي يحتوي على نوع إرجاع أقل من نوع المشتقة.
تطبيق Contravariane (المقابلية) على المعامل. Cotravariance (المقابلية) يسمح بتخصيص معاملات فئة الأصل إلى طرق المندوب التي تتوقع معاملات الفئة المشتقة.
تابعًا على المثال السابق، أضف Method3 الذي يحتوي على نوع معامل مختلف عن المندوب:
delegate Small covarDel(Big mc); class Program { static Big Method1(Big bg) { Console.WriteLine("Method1"); return new Big(); } static Small Method2(Big bg) { Console.WriteLine("Method2"); return new Small(); } static Small Method3(Small sml) { Console.WriteLine("Method3"); return new Small(); } static void Main(string[] args) { covarDel del = Method1; del += Method2; del += Method3; Small sm = del(new Big()); }
Method1 Method2 Method3
كما ترونه، Method3 يحتوي على معامل من فئة Small، بينما يتوقع المندوب معامل من فئة Big. ومع ذلك، يمكنك استخدام Method3 مع المندوب.
يمكنك أيضًا استخدام التباين والمقابلية بنفس الطريقة التي تظهر في الأسفل.
مكلفة صغيرة covarDel (كبيرة mc); فئة Program { static Big Method4(Small sml) { Console.WriteLine("Method3"); return new Big(); } static void Main(string[] args) { covarDel del = Method4; Small sm = del(new Big()); } }
Method4