RSS

المميزات الجديدة في لغة Covariance and Contravariance – C# 4.0

19 May

بسم  الله الرحمن الرحيم

سوف أكمل في هذا الدرس السلسة المتعلقة بالمميزات الجديدة بالغة السي شارب وهذه المرة سوف نتحدث إن شاء الله عن Covariance وأيضا عن Contravariance فلنبدء على بركة الله .

أولا : نطاق عمل Covariance & Contravariance

ماقصده بالنطاق هنا هو المكان التي يتم فيه تطبيق مبدء Covariance & Contravariance وهو كالتالي

•    Generic Delegates & InterFaces

•    Reference Types

ثانيا : تعريف Covariance & Contravariance
Covariance
المقصود بمصطلح (Covariance) هو إرجاع أنواع أكثر إشتقاقا ( Derived Classes) من الدالة (Method ) التي قيمتها المرجعة عبارة عن نوع أقل إشتقاقا وهذا النوع يسبقه الكلمة المعرفة ( Out).ويجب ان تعلم أنه فقط يستخدم مع القيم المرجعة فقط ( Return Types) من الدالة التي تم إستدعائها
Contravariance
المقصود بمصطلح (Contravariance) هو إرسال قيمة أقل إشتقاقا ( Base Classes) إلى دالة ( Method) تأخذ قيم أو تقبل حقول أكثر إشتقاقا ( Derived Classes) وهذا النوع يسبقه الكلمة  المعرفة (In). ويجب أن تعلم أنه فقط يستخدم كإرسال قيم الى الدالة وليس لإسترجاع قيم منها .
قد يبدو الوضع معقدا بعض الشيء ولكن الموضوع كله يتعلق بمباديء الوراثة المتعارفة لدى الجميع ومع الشرح أكثر وإعطاء امثلة سوف نفهم جميعا إن شاء الله مالمقصود  بالمصطلحين السابقين.

ثالثا كيف يمكن أستخدام Covariance & Contravariance
أولا مع Generic Delegates
لنأخذ أحد انواع المفوضات (Delegate ) الموجودة في أطار عمل دوت نت ( .Net FrameWork) وهو المفوض (Func<>) أنظر الى الصورة التالية قبل أن نبدء

كما ترى فإن هذا المفوض (Delegate) يقبل أنواع أقل أشتقاقا في الحقل الأول ويقوم بإرجاع أنواع أكثر إشتقاقا في الحقل الثاني .
لنأخذ مثلا حتى تتضح لنا الصورة

class Program
{
static void Main(string[] args)
{
Func<object,ArgumentException> fn1 = null;

Func<string, Exception> fn2 = null;
fn2 = fn1; //Covariance and Contravariance
}

}

كما ترى في المثال السابق  قمنا بتعريف مفوض من نوع (Func) لديه الإسم (fn1) يقبل حقل من نوع (object) ويعيد قيمة من نوع (ArgumentException) بعد ذلك قمنا بتعريف مفوض أخر من (Func) لديه الأسم (Fn2) يقبل حقل من نوع (string) ويعيد قيمة من نوع (Exception) بعد ذلك قمنا بإسناد (fn1) إلى (fn2) وكما تلاحظ فإن الحقل الأول من (fn1) هو منوع (object) وهو أقل إشتقاقا من (string) وأن الحقل الثاني هو من نوع (ArgumentException) وهو أكثر إشتقاقا من (Exception)

ثانيا مع Generic Interface
طبعا Generic interface تأخذ نفس مفهوم المفوضات (Delegates) حيث بإمكانك أن تعود بقيم أكثر إشتقاقا وترسل قيم أقل إشتقاقا
أنظر الى المثال التالي

public IEnumerable<Exception> GetAllException()
{
IEnumerable<ArgumentException> c=null;
return c;
}

كماترى من المثال السابق فإن القيمة التي سيتم إرجاعها من الدالة (GetAllException) هي من نوع (IEnumerable<Exception>) ولكن في الحقيقة مايتم إرجاعه من الدالة هو من نوع (IEnumerable<ArgumentException>) وهو نوع أكثر إشتقاقا من النوع الذي من المفترض أن يعيده أنظر معي الى الصورة التالية التي سوف توضح لك كل شيء إن شاء الله

كما ترى في الاعلى لدينا فصيلة (Class) من نوع عربة وفصيلة أخرى مشتقة من نوع عربة وهي سيارة (Cars) وفصيلة أخرى مشتقة من فصيلة سيارة وهي من نوع سيارة رياضية (Sport Cars) وكما ترى فكما نزلت الى الاسفل فهذا يعتبر اكثر إشتقاقا وكلما صعدت الى الاعلى فهذا يعتبر أقل إشتقاقا وهذا هو مبدء Covariance & Contravariance

الخلاصة
قمت في هذا الدرس بشرح مفهوم Covariance & Contravariance وكيف يمكن إستخدامه والنطاق الذي يستخدم فيه وحقيقة الأمر ان إطار عمل دوت نت (.Net FrameWork) يدعم هذه الميزة في جميع مفوضاته (Generics Delegate) وجميع واجهاته ( Genrics interface) وبإمكانك أيضا أن تستخدمها في الاكواد التي تكتبها والتي تتعامل بوجه التحديد مع (Generics) وبهذا الدرس أنهي سلسلة الدروس التي قدمتها عن المميزات الجديدة في لغة (C#4.0)
أتمنى أن أكون قد وفقت في الطرح
والله أعلم

About these ads
 
1 Comment

Posted by on May 19, 2010 in C#

 

Tags: , , , , , , ,

One response to “المميزات الجديدة في لغة Covariance and Contravariance – C# 4.0

  1. ramy samir

    May 21, 2010 at 1:33 pm

    شكرا

     

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
Follow

Get every new post delivered to your Inbox.

%d bloggers like this: