![]() |
|
الدرس الواحد والثلاثون - ال Generic - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : الأقسام التعليمية - المنتدى القديم (http://vb4arb.com/vb/forumdisplay.php?fid=90) +--- قسم : قسم دورات المنتدى (http://vb4arb.com/vb/forumdisplay.php?fid=113) +---- قسم : دورة .net 2008 . لنبدأ سوياً (http://vb4arb.com/vb/forumdisplay.php?fid=138) +---- الموضوع : الدرس الواحد والثلاثون - ال Generic (/showthread.php?tid=5625) |
الدرس الواحد والثلاثون - ال Generic - RaggiTech - 14-10-12 كاتب الموضوع : أحمد جمال
بسم الله الرحمن الرحيم .السلام عليكم ورحمة الله وبركاته . نواصل في هذا الدرس مع واحدة من التطورات الجديدة مع .net framework 2.0 ، هي ال generics لتعطي بعداً جديداً لمفهوم ال overloading ، لنفترض مثالاً ما للطباعة بالشكل التالي : C#: كود : [FONT=Tahoma]public static void print(int x)vb.net: كود : [FONT=Tahoma]Public Shared Sub print(ByVal x As Integer) الكود كما هو واضح قام بعمل ثلاث دوال بنفس الاسم لاستقبال بارميترات مختلفة ، وهكذا تجد انك تستطيع في الكود استدعاء الدالة الطباعة للارقام او لل longs او للنصوص ، جرب عدة عمليات لطباعة انواع مختلفة وشاهد جملة الطباعة ، على سبيل المثال الأوامر التالية : كود : [FONT=Tahoma]print("Ahmed");سيكون ناتج الطباعة بالشكل التالي : ال Generics ستغير المفهوم نوعاً ، حيث ان بامكانك الآن تعريف دالة لا تستقبل نوعاً معيناً من المتغيرات ، بل هي تستقبل <T> وتتعامل معه على هذا الاساس ، لذا قد نستطيع افتراض الدوال الثلاث السابقة بالشكل التالي : C#: كود : [FONT=Tahoma]public static void print<T>(T x)vb.net: كود : [FONT=Tahoma]Public Shared Sub print(Of T)(ByVal x As T) والآن في حالة تطبيقنا لنفس المثال السابق ، سوف يكون الناتج كالتالي : كانت هذه مقدمة سريعة لل Generics ، نواصل في دروس قادمة التعرف على نقاط أخرى حول هذا الموضوع ، لا تنس ان هذا درس من سلسلة دروس نطبق فيها مبادئ تتعلق ب LINQ حيث ان كل ما يتعلق بالانواع المجهولة والدوال المجهولة ... الخ يتعلق بشكل أو بآخر بال LINQ . الدرس الواحد والثلاثون - ال Generic - RaggiTech - 14-10-12 Structure and Class Generics : في الدرس السابق تعرفنا على ال methods التي تطبق ال Generics ، ايضاً ال Classes وال Structs يمكنها تطبيق هذا المفهوم لبعض البيانات بها ، سنفترض مثال ال class وما ينطبق على ال class ينطبق على ال struct . لنفترض كلاس يحتوي على البضائع ، وحيث ان لدينا نوعين من البضائع يحتوي النوع الأول على الاسم وهي تلك البضائع التي يتم تصنيعها في المحل ( انوع من الجبن او الزبادي ) وبضائع أخرى جاهزة تحتوي على الباركود ، بهذه الطريقة نسنتج ان حقل Identify قد يحتوي على اسم في بعض البضائع ورقم في بضائع أخرى . الحل التقليدي كان ليعتبر وجود كلاسين منفصلين ، أو في أحسن الظروف وضع قيمة منطقية لتحديد اذا ما كنت ساستخدم حقل ال name ام حقل ال numbner ، لكن مع ال Generics تم تغيير هذا المفهوم ، في هذه الحالة سيصبح الكلاس بالشكل التالي : c#: كود : public class product<T>كود : Public Class product(Of T) C#: كود : product<int> prd = new product<int>(1001);كود : Dim prd As New product(Of Integer)(1001)C#: كود : product<string> prd2 = new product<string>("Some Product");كود : Dim prd2 As New product(Of String)("Some Product")الدرس الواحد والثلاثون - ال Generic - RaggiTech - 14-10-12 Generic Collection : كما تعرفنا في الدرس السابق ان بامكاننا عمل Generic Class ، اصبح الدور الآن على عمل Generic Collection ، سنقوم بعمل كلاس يستقبل عدة كلاسات ويقوم بعدة عمليات مثل Add,Delete ... etc ، كما تعلمنا سابقاً ، هذا مثال على Collection ما : C#: كود : [FONT=Tahoma]public class MyCollection<T>[/FONT]vb.net: كود : [FONT=Tahoma]Public Class MyCollection(Of T) طبعاً بامكانك اضافة الكثير من الخصائص وربما بعض الخصائص الغير متوفرة اصلاً للبحث وخلافه ، هذا ما يسمى بال Generic Collection حيث يمكن في مراحل لاحقة الاعتماد عليه بدل ال Colelctions العادية حيث يمكن ان يستقبل Car او Employee .... إلى غير ذلك من الخيارات ، بالشكل التالي مثلاً : C#: كود : [FONT=Tahoma]MyCollection<Car> myCars = new MyCollection<Car>();vb.net: كود : [FONT=Tahoma]Dim myCars As New MyCollection(Of Car)() أو حتى ارقام : C#: كود : MyCollection<int> myCars = new MyCollection<int>();vb.net: كود : Dim myCars As New MyCollection(Of Integer)() هنا ظهرت لنا مشكلة تتعلق بكون ال Generic Collection الخاص بنا يحتوي على خصائص مثل .name لعرضها ، وهذا ما لا يتوفر مثلاً لكل الكلاسات او للارقام مثلاً ، من هنا جاءت لنا الكلمة المحجوزة Where والتي سنتحدث عنها في الدرس القادم . الدرس الواحد والثلاثون - ال Generic - RaggiTech - 14-10-12 Where T : يتيح لنا هذا الشرط في عمل ال Generic Collection ان لا نقبل سوى بعض الفئات ، يمكننا وضع الشروط بأحد الطرق التالية : where T : struct بحيث لا يقبل سوى متغيرات من النوع ValueTpe . where T : class لا يقبل سوى من النوع RefernceType . where T : new() لا بد ان يحتوي على Constructor . where T : classname where T : Iinterfacename لا بد ان يكون مشتق من class معين او يطبق interface معين . بهذه الطريقة يمكننا دمج عدة شروط مع بعضها ، لنرى المثال التالي سوية : C#: كود : public class Example <T> where T : class, IComparable, new()vb.net: كود : [FONT=Tahoma]Public Class Example(Of T As {Class, IComparable, New}) [/FONT]هذا يعني ان T لا بد ان تكون refernce ، تطبق الواجهة IComparable وتحتوي على Constructor . ايضاً المثال التالي : c#: كود : public class Example<K, T> where K : class, new()vb.net: كود : Public Class Example(Of K As {Class, New}, T As IComparable(Of T))هذا يعني ان T لا بد ان تكون Refernce ولها constructor فيما k لا بد ان تطبق الواجهة IComparable . والآن ، اصبح بامكانك التحكم بعض الشيء في T بدلاً من جعلها مفتوحة للجميع . الدرس الواحد والثلاثون - ال Generic - RaggiTech - 14-10-12 آخر نقطة انبه عليها في هذا الدرس ، انه وتحت مجال الاسماء System.Collections.Generic تجد العديد من ال Collections التي تعاملنا معها سابقاً مثل ال Queue او ال Stack ، ولكن بدلاً من تعاملها مع object فهي تطبق مبادئ ال Generics باستقبالها T . الآن استطيع ان ازعم انني غطيت بعض النقاط الاساسية في عالم ال Generics ، اتمنى ان اكون قد قدمت شيئاً جديداً . والله الموفق ... والسلام عليكم ورحمة الله وبركاته . |