هذا درس بسيط في ال Generics باستخدام ال VB.net الاصدار 2005
مبدئيا محترفي ال ++C يفهمون الConcept الخاص بالGenerics لانه مقتبس بالكامل من ال Templates في ال ++C.
ثانيا لشرح المفهوم بطريقة سريعة تابع الكود التالي على سبيل المثال
Dim myList as New ArrayList() myList.Add(4535) myList.Add(18989) myList.Add(3455)
في الكود السابق ستجد ان ال myList استخدمت و كأنها Array of Integers و لكن المشكلة الاساسية ان الCompiler لن يرفض جملة مثل هذه
myList.Add("String Data")و هذا لان الArrayList تقبل اي متغير من اي نوع و تقوم بعمل Boxing له في نوع Object.
و لهذا فعند استعادة القيم من ال ArrayList فاننا نقوم بعمل Type Conversion
Dim myIntVar as Integer = CInt(myList.Item(0))
و لكن مشكلة اخرى ان الCompiler لن يعترض على هذه الجملة
بفرض وجود Class من اختراعنا اسمها BusinessObject
Dim myObject as BusinessObject = CType(myList.Item(0), BusinessObject)
بفرض ان القيمة الاولى في الList كانت اساسا من نوع Integer و ليس من نوع BusinessObject و لكن الCompiler لن يعترض و لكن سيحدث InvalidCastException في اثناء الRuntime و قد تقضي ساعات في محاولة اصلاح الخطأ
كل هذه المشكلات نشأت من ان الArrayList تقبل اي نوع و هكذا فقدنا ميزة الType Safe.
تابع معي هذا الكود
Dim MyNewList as New List(Of Integer) MyNewList.Add(1020) MyNewList.Add(3040)
ستجد في الكود السابق اننا استخدمنا الGenerics في انشاء List من نوع معين اي انها لن تقبل اي متغيرات او قيم من اي نوع اخر اي اننا اذا كتبنا هذا السطر
MyNewList.Add("String Data")سيعترض الCompiler بشدة على هذه الجملة بسبب ان MyNewList لا تقبل Strings
أيضا يمكنك استخدام القيم من الList مباشرة على انها Integer بدون الحاجة لعمل Cast
كما ان استخدام الGenerics غير مقصور على الabstract types مثل ال integer و الstring و الfloat و .... الخ بل انه يمتد الى اي نوع اخر من الtypes اي اننا يمكننا ان نبني List من نوع BusinessObject
Dim MyBusinessList as New List(of BusinessObject)
ارجو ان يكون المفهوم الاساسي قد وصل الى الاذهان
المرحلة التالية هي بناء اول Generic خاصة بنا
تابع الكود التالي
Public Class MyGeneric(Of T) Dim X as T; Public Property MyX() as T Set(ByVal Value as T) Me.X = Value End Set Get Return Me.X End Get End Property End Class
اعتقد ان الكود يشرح نفسه و لكن سأحاول تفسيره
عند استخدام هذا الكود هكذا
Dim MyObject as New MyGeneric(of Integer) ()
بعد تنفيذ هذا السطر سيتم انشاء object من نوع MyGeneric و ستصبح قيمة T هي Integer و بالتالي سيصبح المتغير الداخلي X من نوع Integer
أيضا يمكنك ان تجعل الGeneric تأخذ اكثر من Type مثل
public class MyGen(of T1, T2)
ارجو ان تعم الفائدة على الجميع.
الدرس القادم Generic Methods

