با سلام!
مطلبی رو که امروز براتون آماده کردم. یه کم با مطالب قبلی تفاوت داره. احتمالا یه کم پیچیده تر.
ترمینولوژی:
Variant : چیزی که به چیزهای دیگر وابستگی دارد اما دقیقا مشابه نیست، گوناگون، متغیر
پیشوند Contra : ضد، مخالف، نقیض
پیشوند Co : با، باهم
برای پارامترهای نوع Generic (عام)، کلمه کلیدی in تعیین می کند که پارامتر آن نوع عام Contravariant است. شما می توانید از این کلمه کلیدی (in) در رابط های (Interface) عام و نماینده ها (delegate) استفاده کنید.
کنتراواریانس این توانایی رو به شما می دهد که از نوع کمتر مشتق شده (پایه ای تر، ریشه ای تر) نسبت به آن نوعی که پارامتر generic تعیین کرده استفاده کنید. که اجازه تبدیل ضمنی کلاس هایی که اینترفیس های گوناگون را پیاده سازی کرده اند را می دهد.
همچنین اجازه می دهد تبدیل ضمنی نوع های وکیل بدرستی انجام شود.
Covariance و Contravariance در پارامترهای نوع جنریک برای نوع های مرجع پشتیبانی شده است، اما آنها برای نوع های مقداری پشتیبانی نشده اند.
یک نوع در اینترفیس عمومی یا وکیل می تواند کواریانت اعلان شده باشد، اگر فقط به عنوان آرگومان متد استفاده شده باشد، نه به عنوان نوع برگشتی متد.
پارامترهای ref و out نمی توانند واریانت باشند.
اینترفیسی که پارامتر کنتراواریانت دارد به متدهایش اجازه می دهد که آرگومان های نوع کمتر مشتق شده نسبت به آنهایی که توسط پارامتر نوع اینترفیس تعیین شده را قبول کند.
برای مثال چون در NET Framework 4. در واسط
IComparer<T>
نوع T کنتراواریانت است. شما می توانید شئ
IComparer<Person>
را به شئ نوع
IComparer<Employee>
انتساب دهید، بدون اینکه از هیچگونه متد تبدیل خاص استفاده کنید، اگر Person از Employee ارث بری کند.
یک وکیل کنتراواریانت می تواند به وکیل دیگری از نوع مشابه انتساب داده شود، اما با پارامتر نوع جنریک کمتر مشتق شده (پایه ای تر).
نکته: می توان iobj رابه istr انتساب داد؛ چون واسط IContravariant ضدگوناگونی است.
من تا به حال چنین وبلاگ پرباری در زمینه برنامه نویسی #c ندیده بودم.
امیدوارم پیشرفت خوبی داشته باشید.
باتشکر.